ACM-ICPC 2018 焦作赛区网络预赛 G Give Candies(高精度求余)
https://nanti.jisuanke.com/t/31716
题意
n颗糖果n个人,按顺序给每个人任意数目(至少一个)糖果,问分配方案有多少。
分析
插板法或者暴力打表后发现答案就为2^(n-1),只是这个n有点大。于是马上用java。然而现实相当残酷,超时。
然后想到降幂,即(a^b)%m=a^(b%phi(m))%m,当gcd(b,m)==1。这里显然互质,于是降幂后仍然用java写,还是tle。
而后还尝试了C++大数来写,可能是使用姿势错误,也t了。
到了最后一小时,没错,我们队卡这题卡到了最后一小时,很绝望。
最后想到了直接模拟求余就好了,其它大数操作都是不必要的。到此,终于过了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5+10; const int mod = 1e9 + 7; char s[maxn]; ll qpow(ll a,ll b){ ll res=1; while(b){ if(b&1) res=res*a%mod; b>>=1; a=a*a%mod; } return res; } int main(){ int t; scanf("%d",&t); int phi = 1e9 + 6; while(t--){ scanf("%s",s); ll ans=0; int n = strlen(s); for(int i=0;i<n;i++){ ans=(ans*10+(s[i]-'0'))%phi; } ans=(ans-1+phi)%phi; printf("%lld\n",qpow(2,ans)); } return 0; }