BZOJ 1008 - 越狱(排列组合+快速幂)

本文解析了HNOI2008越狱问题,介绍了如何通过计算总状态数减去不能越狱的状态数来得出可能越狱的状态数。使用快速幂算法进行高效计算,并提供了具体的代码实现。

                                    1008: [HNOI2008]越狱

 

Description

  监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

Input

  输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output

  可能越狱的状态数,模100003取余

Sample Input

2 3

Sample Output

6

HINT

 

  6种状态为(000)(001)(011)(100)(110)(111)

解题思路:

       能够越狱的状态数 = 总的状态数 - 不能越狱的状态数。

       即越狱的状态数=m^n - m*(m-1)^(n-1),再用快速幂计算就行了。

快速幂:

快速幂算法依赖于以下明显的公式:
这里写图片描述

   a^b%c,先把b化成二进制形式,然后所有非0的位置(k0,k1,……kw)。

快速幂代码:

int Powermod(int a,int b)
{
	int ans=1;
	a=a%c;
	while(b>0)
	{
		if(b%2==1)
			ans=(ans*a)%c;
		b=b/2;
		a=(a*a)%c;
	}
	return ans;
}

代码:

#include<stdio.h>
#define c 100003
long long n,m;
long long powermod(long long a,long long b)
{
	long long ans=1;
	a%=c;
	while(b>0)
	{
		if(b%2==1)
			ans=(ans*a)%c;
		b/=2;
		a=(a*a)%c;
	}
	return ans;
}
int main()
{
	long long a,b,ans;
	while(scanf("%lld%lld",&m,&n)!=EOF)
	{
		ans=0;
		a=powermod(m,n);
		b=m*powermod(m-1,n-1)%c;
		ans=a-b;
		if(ans<0)
			ans+=c;
		printf("%lld\n",ans);
	}
	return 0;
}

 

源码来自:https://pan.quark.cn/s/a4b39357ea24 ### 操作指南:洗衣机使用方法详解#### 1. 启动与水量设定- **使用方法**:使用者必须首先按下洗衣设备上的“启动”按键,同时依据衣物数量设定相应的“水量选择”旋钮(高、中或低水量)。这一步骤是洗衣机运行程序的开端。- **运作机制**:一旦“启动”按键被触发,洗衣设备内部的控制系统便会启动,通过感应器识别水量选择旋钮的位置,进而确定所需的水量高度。- **技术执行**:在当代洗衣设备中,这一流程一般由微处理器掌管,借助电磁阀调控进水量,直至达到指定的高度。#### 2. 进水过程- **使用说明**:启动后,洗衣设备开始进水,直至达到所选的水位(高、中或低)。- **技术参数**:水量的监测通常采用浮子式水量控制器或压力感应器来实现。当水位达到预定值时,进水阀会自动关闭,停止进水。- **使用提醒**:务必确保水龙头已开启,并检查水管连接是否牢固,以防止漏水。#### 3. 清洗过程- **使用步骤**:2秒后,洗衣设备进入清洗环节。在此期间,滚筒会执行一系列正转和反转的动作: - 正转25秒 - 暂停3秒 - 反转25秒 - 再次暂停3秒- **重复次数**:这一系列动作将重复执行5次,总耗时为280秒。- **技术关键**:清洗环节通过电机驱动滚筒旋转,利用水流冲击力和洗衣液的化学效果,清除衣物上的污垢。#### 4. 排水与甩干- **使用步骤**:清洗结束后,洗衣设备会自动进行排水,将污水排出,然后进入甩干阶段,甩干时间为30秒。- **技术应用**:排水是通过泵将水抽出洗衣设备;甩干则是通过高速旋转滚筒,利用离心力去除衣物上的水分。- **使用提醒**:...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值