http://www.lydsy.com/JudgeOnline/problem.php?id=1008

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)

从题目里可以知道,N个房间M个宗教,可能产生的所有状态为A=N^M,要求出所有可能越狱的状态可能比较难,不如使用逆向思维,求所有不可能的越狱状态,可知只要相邻的房间宗教不同即可,故所有的不可能越狱状态为B=M*(M-1)*(M-1)...(M-1)=M*(M-1)^(N-1),那么答案就是A-B了,写个快速幂函数求出A,B即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*ll quickpower(ll m,ll n)//简写版本
{
if(n==0) return 1;
ll temp=quickpower(m,n>>1);// n>>1 == n/2 n的二进制右移几位就是除以2的n次方
temp=temp*temp%100003;
if(n&1) temp=temp*m%100003;// n&1也就是取n的二进制最低位,判断n是否为奇数,是则为1
return temp%100003;
}*/
ll quickpower(ll m,ll n)//更容易看懂的版本
{
if(n==0) return 1;
else
{
while((n&1)==0)
{
n>>=1;
m=m*m%100003;
}
}
int temp=m;
n>>=1;
while(n!=0)
{
m=m*m%100003;
if((n&1)!=0) temp=temp*m%100003;
n>>=1;
}
return temp;
}
int main()
{
ll m,n;
cin>>m>>n;
m%=100003;
ll ans=quickpower(m,n);
ans-=(m*quickpower(m-1,n-1))%100003;
cout<<(ans+100003)%100003<<endl;
return 0;
}

最新文章

  1. pureftp在centos下与MySQL搭配使用
  2. DNS(二)之构建域名解析缓存
  3. js中的with语句
  4. Unity运行时刻资源管理
  5. DelPhi连接数据库方式
  6. CentOS7安装Oracle 11g R2 详细过程——零基础
  7. HDU4718 The LCIS on the Tree(LCT)
  8. linux源码阅读笔记 #define 语句的妙用
  9. Spring个人总结
  10. python使用PIL压缩图片
  11. 优化之XML组件
  12. 二、jspxcms使用-用户和模型
  13. 作业(更新ing)
  14. ClickHouse之clickhouse-local
  15. 异步async/await简单应用与探究
  16. 用GraphX分析伴生网络(二)
  17. day25类的组合多态封装
  18. python3 发送邮件功能
  19. referrer privacy hotlinking
  20. ADB命令行工具使用

热门文章

  1. Android Hello World程序开发过程
  2. java基础技术集合面试【笔记】
  3. K8S日志接入sls配置
  4. Docker入门第九章
  5. 题解 P3322 [SDOI2015]排序
  6. 题解 God Knows
  7. 手把手教你AspNetCore WebApi:Swagger(Api文档)
  8. HTML &lt;form&gt; 标签的 method 属性
  9. C#如何调用DOS命令
  10. jsoup的Document类