P11893

思路

枚举 分别几个, 不能放在开头,还要留至少一个

拆开 ,把 扔进组合数里,后半部分

,后半部分可以写为 的幂次加一些系数。

整理后:

希望能把 相关扔进组合数里。可以有 ,所以

整理后:

可以写为一些 的幂次减去 个多算的值。

可以一步步从暴力改式子。

边读入边取模,注意快速幂的幂次别搞成负数。

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