【BZOJ 1008(改)】宗(xie)教 ——数论,快速幂

来源:互联网 发布:iphone软件怎么做 编辑:程序博客网 时间:2024/04/16 15:43

3.宗教
(lovelive.pas/c/cpp)
【题目背景】
12dora 终于抓到了 n 个⑨bishi 的村民,他想把这些村民关到 n 个牢房里,然而事情远
没有他想的那么简单…
【题目描述】
N 个牢房排成一排,其中第 i 个牢房和第 i+1 个牢房相邻。
因为抓到的都是死肥宅,他们都信仰 B 站的某一种邪宗教(比如 lovelive,东方 project,彩
虹小马,索尼,舰队 collection,OI 等等)。然而他发现,如果相邻两个牢房的犯人信仰同一个
神教,那么生无可恋的他们就会联合起来一起越狱。共创美♂好的新生活。
现在,已知抓到了 n 个犯人,B 站有 m 种宗教,每个人会信仰其中一种。12dora 并不
知道他们每人都信什么宗教,所以他想知道有多少种状态会有人越狱。于是他把目光投向了
你。
因为答案可能很大,你只需要告诉 12dora 答案对 100003 取余的结果。
【输入描述】
一行两个数 m 和 n,表示 m 种邪宗教和 n 个犯人。
【输出描述】
一个数,表示越狱的方案数。对 100003 取余。
【样例输入】
2 3
【样例输出】
6
【数据范围及提示】
6 种状态为(000)(001)(011)(100)(110)(111)
100%的数据:1<=M<=10^8,1<=N<=10^12
填坑?
题目出处:http://www.lydsy.com/JudgeOnline/problem.php?id=1008
那么就来推公式吧。(%%%Loi_a)
每个犯人只能信仰一种邪教,总方案数就是m^n,
如果第一个犯人信仰了第某一个宗教,同时如果第二个犯人和第一个犯人信仰的宗教不同,那他只有m-1种选择,同样,第三个犯人也只有m-1种选择,以此类推,所有犯人都不越狱的方案数为m*(m-1)^(n-1)
所以越狱的方案数为m^n-m*(m-1)^(n-1)

#include<cstdio>using namespace std;typedef long long ll;const int mod=100003;ll ksm(ll di,ll zhi){    if(zhi==0)    return 1;    if(zhi==1)    return (di)%mod;    if(zhi%2==1)    {        ll x=ksm(di,zhi>>1)%mod;        return x*x*di%mod;    }    if(zhi%2==0)    {        ll x=ksm(di,zhi>>1)%mod;        return x*x%mod;    }}int main(){    ll n,m;    scanf("%lld%lld",&m,&n);    ll x=ksm(m,n)%mod;    ll y=ksm(m-1,n-1)%mod;    y=(y%mod*m%mod)%mod;    printf("%lld",(x%mod-y%mod+mod+mod)%mod);    return 0;   }
0 0