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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值