首页 > 其他 > 详细

bzoj P1008

时间:2017-10-17 18:12:45      阅读:222      评论:0      收藏:0      [点我收藏+]

这道题数据范围给的比较大,1<=M<=10^8,1<=N<=10^12

所以不是模拟/枚举/暴力/正常做法,应该是O(1)或者log级别的。。。

一看,好像有好多种情况,所以不能用O(1)的数学方法

应该是组合计数,所以是快速幂

可能的次数为m^n种,但是会有重复的可能,所以要减去重复的次数(m-1)^(n-1)

加个优化,将m^n优为(m%100003)^n,但是可能会导致比重复的次数多,所以要加上100003,然后再%100003,这对答案是不影响的

#include<bits/stdc++.h>
#define mod 100003
long long n,m;
long long solve(long long x,long long y){
long long now=x,ans=1;
for(;y;y>>=1,now=now*now%mod)if(y&1) ans=ans*now%mod;
return ans;
}
int main(){
scanf("%lld%lld",&m,&n);
printf("%lld",(solve(m%mod,n)-m*solve((m-1)%mod,n-1)%mod+mod)%mod);
return 0;
}

 

bzoj P1008

原文:http://www.cnblogs.com/heqingyu/p/7683016.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!