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; }