博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2008]越狱
阅读量:6574 次
发布时间:2019-06-24

本文共 1386 字,大约阅读时间需要 4 分钟。

1008: [HNOI2008]越狱

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 5247  Solved: 2270
[][][]

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)

 

   此题属于一道组合数学问题,我一开始还以为是DP。。。。

  所有的可能宗教信仰方案为:M^N,因为有N个监狱,每个监狱的犯人的宗教有M中选择

  不能越狱(相邻两个房间的人的宗教信仰不同)的方案为:M*(M-1)^(N-1),第一个监狱里的犯人可以有M个宗教选择,第二个监狱里的犯人可以有M-1中选择(保证和第一个监狱里的犯人不重复即可),同理,第三个监狱的犯人只需和第二个监狱里的不一样,也是M-1个选择,,,,以此类推,共N个监狱,除第一个监狱有M个选择,其余N-1个监狱只有M-1中选择,所以M*(M-1)^(N-1)

  于是最终的答案: [M^N-M*(M-1)^(N-1)]%100003

  由于N,M都比较大,所以借助了快速幂(讲解:www.cnblogs.com/CXCXCXC/p/4641812.html)

  中间有很多细节需要mod,处处mod,mod前想想对不对,还有((M^N)%mod-(M*(M-1)^(N-1))%mod)%mod有可能为负数,可以特判,若ans<0,ans+=mod 也可以((M^N)%mod+mod-(M*(M-1)^(N-1))%mod)%mod 即中间加个mod

1 #include
2 using namespace std; 3 typedef long long LL; 4 const int mod=100003; 5 LL M,N; 6 LL ans; 7 8 LL poww(LL a,LL b){ 9 LL base=a;10 LL ans1=1;11 while(b!=0){12 if(b&1!=0){13 ans1=ans1*base;14 ans1=ans1%mod;15 }16 base=base*base;17 base=base%mod;18 b=b>>1;19 }20 return ans1%mod;21 }22 int main(){23 cin>>M>>N;24 ans=(poww(M,N)+mod-(M*poww(M-1,N-1))%mod)%mod;25 cout<

 

 

转载于:https://www.cnblogs.com/CXCXCXC/p/4661980.html

你可能感兴趣的文章
Python脚本日志系统
查看>>
Spring异常——BeanNotOfRequiredTypeException
查看>>
B0BO TFS 安装指南(转载)
查看>>
gulp常用命令
查看>>
TCP(Socket基础编程)
查看>>
RowSet的使用
查看>>
表单提交中的input、button、submit的区别
查看>>
每日一记--cookie
查看>>
约瑟夫环
查看>>
WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
查看>>
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
查看>>
MySQL:创建、修改和删除表
查看>>
Java多线程程序设计详细解析
查看>>
IOS 7 Study - UISegmentedControl
查看>>
八、通用类型系统
查看>>
JQuery的ajaxFileUpload的使用
查看>>
Java分享笔记:使用keySet方法获取Map集合中的元素
查看>>
Java面向对象练习题之人员信息
查看>>
关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
查看>>
ios 控制器的生命周期
查看>>