大概是
∑Cin∗2∗ik∗(ik−(n−i)k)modm
后面那个东西模
m
<script type="math/tex" id="MathJax-Element-66">m</script>有循环节 同一组的组合数的和用lucas定理也能化成组合数乘上2的幂
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1000005;
int n,K,P,m;
ll inv[N];
inline ll Pow(ll a,int b){
ll ret=1;
for (;b;b>>=1,a=a*a%P)
if (b&1)
ret=ret*a%P;
return ret;
}
inline ll Inv(ll a){
return Pow(a,P-2);
}
char s[N];
int len;
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%s%d%d",s+1,&K,&P);
inv[1]=1; for (int i=2;i<P;i++) inv[i]=(ll)(P-P/i)*inv[P%i]%P;
len=strlen(s+1); m=P;
ll nm=0,n_m=0,rest=0;
for (int i=1;i<=len;i++){
nm=(nm*10+s[i]-'0')%m;
rest=rest*10+s[i]-'0';
n_m=(n_m*10+rest/m)%(m-1);
rest%=m;
}
// printf("%lld %lld\n",n_m,nm);
ll ans=0,C=1;
for (int i=1;i<=min(m-1,(int)nm);i++){
C=C*(nm-i+1)%P*inv[i]%P;
ll p1=Pow(i,K),p2=Pow(nm+m-i,K);
// printf("%lld %lld\n",p1,p2);
ans+=C*p1%P*(p1+P-p2)%P;
// printf("%lld\n",ans%P);
}
// printf("%lld\n",ans%P);
ans=ans%P*Pow(2,n_m+1)%P;
printf("%lld\n",ans);
return 0;
}