ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies(费马小定理 + 快速幂)

ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies


题目

有 n 个小朋友, n 个糖果。从 1 号小朋友开始发糖,每次发任意数量(但不少于 1 个)。直到发完,或者没有糖。问最终有多少种发糖方式。(n < 1 0 100000 , m o d = 1 e 9 + 7 ) 10^{100000}, mod = 1e9 + 7) 10100000,mod=1e9+7)

分析

首先这就是个整数划分的问题,通过打表也可以看出来答案是 a n s = 2 n − 1 ans = 2^{n-1} ans=2n1

但是可以看到,n 很大,这里用大数存,再计算估计也不行。这个形式可以想到费马小定理。 a p − 1 ≡ 1 ( &VeryThinSpace; m o d &VeryThinSpace; p ) a^{p-1} \equiv 1(\bmod p) ap11(modp)
2 n = 2 k ∗ ( p − 1 ) + n &VeryThinSpace; m o d &VeryThinSpace; ( p − 1 ) = 1 ∗ 1 ∗ . . . . ∗ 2 n &VeryThinSpace; m o d &VeryThinSpace; ( p − 1 ) = 2 n &VeryThinSpace; m o d &VeryThinSpace; ( p − 1 ) ( &VeryThinSpace; m o d &VeryThinSpace; p ) 2^{n} = 2^{k*(p-1) + n \bmod (p-1)} = 1 * 1 * .... * 2^{n \bmod (p-1)} = 2^{n \bmod (p-1)}(\bmod p) 2n=2k(p1)+nmod(p1)=11....2nmod(p1)=2nmod(p1)(modp)
2 n − 1 = 2 n &VeryThinSpace; m o d &VeryThinSpace; ( p − 1 ) − 1 ( &VeryThinSpace; m o d &VeryThinSpace; p ) 2^{n - 1} = 2^{n \bmod (p-1) - 1}(\bmod p) 2n1=2nmod(p1)1(modp)

所以 n 降到 (p-1) 之内再计算即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define INF 0x3f3f3f3f
#define fuck(x) cout<<x<<endl
const int N = 2e5 + 10;     
const ll mod = 1e9 + 7;

int t;
char num[N];

ll qpm(ll x, ll y){
    ll ans = 1;
    while(y){
        if(y&1)
            ans = ans * x % mod;
        x = x * x % mod;
        y >>= 1;
    }
    return ans;
}

int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%s", num);
        int len = strlen(num);
        ll ans = 0;
        for(int i = 0; i < len; i++){
            ans *= 10;
            ans += (num[i] - '0');
            ans %= (mod - 1);
        }
        printf("%lld\n", qpm(2, --ans));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值