思路
枚举 和 分别几个, 不能放在开头,还要留至少一个 。
拆开 ,把 扔进组合数里,后半部分 。
由 ,后半部分可以写为 的幂次加一些系数。
整理后:
希望能把 相关扔进组合数里。可以有 ,所以 。
整理后:
由 , 可以写为一些 和 的幂次减去 个多算的值。
可以一步步从暴力改式子。
边读入边取模,注意快速幂的幂次别搞成负数。
code
void work(){
l=read();scanf("%s",s+1);
for(int i=1;i<=l;i++){
n1=n1*10+s[i]-'0',n2=n2*10+s[i]-'0';
if(i%9==0)n1%=mod,n2%=mod-1;
}
n1%=mod,n2%=mod-1;
if(l>=10)n1+=mod,n2+=mod-1;
(ans+=2*(n1-1)*(n1-2)%mod*ksm(3,n2-3))%=mod;
(ans+=mod-2*(n1-1)*(n1-2)%mod*(ksm(2,n2-3)+1)%mod)%=mod;
(ans+=mod-(n1-1)*(n1-2)%mod*(ksm(2,n2-3)-2)%mod)%=mod;
// for(int i=2;i<=n-3;i++)(ans+=2*(n-1)*(n-2)%mod*C(n-3,i-1)%mod*(pw[n-i-2]))%=mod;
(ans+=(mod-n1+2)*ksm(3,n2-1)%mod)%=mod;
(ans+=mod-(mod-n1+2)*(ksm(2,n2-1)+(n1-1)*ksm(2,n2-2)%mod+(n1-1)*2+1)%mod)%=mod;
(ans+=mod-(mod-n1+2)*(ksm(2,n2-1)-2*n1)%mod)%=mod;
// for(int i=2;i<=n-3;i++)(ans+=C(n-1,i)*(mod-n+2)%mod*(pw[n-i-1]))%=mod;
// for(int i=2;i<=n-3;i++)(ans+=C(n-1,i)*(i-1)%mod*(n-i-2)%mod*(pw[n-i-1]-1))%=mod;
ans%=mod,ans+=mod,ans%=mod;
printf("%lld\n",ans);
}