jzoj3056-数字【数位dp,统计,容斥】
正題
題目大意
求有多少個2?n2*n2?n位的數字(允許有前導零)滿足
解題思路
預處理數組fi,jf_{i,j}fi,j?表示iii位數,數字之和為jjj時的方案數。
動態轉移方程
fi,j=∑k=1mfi,j?akf_{i,j}=\sum_{k=1}^mf_{i,j-a_k}fi,j?=k=1∑m?fi,j?ak??
然后我們若不考慮兩種情況重合答案就是
2?∑i=1n(fn,i)22*\sum_{i=1}^n(f_{n,i})^22?i=1∑n?(fn,i?)2
那我們考慮重合,那么就是奇數位等于偶數位之和且前nnn位等于后nnn位之和的情況。我們可以轉換為:
前nnn位中奇數位之和===后nnn位中偶數位之和
且
前nnn位中偶數位之和===后nnn位中奇數位之和
這種情況就是
(∑i=1n(fn/2,i)2)?(∑i=1n(fn?n/2,i)2)(\sum_{i=1}^n(f_{n/2,i})^2)*(\sum_{i=1}^n(f_{n-n/2,i})^2)(i=1∑n?(fn/2,i?)2)?(i=1∑n?(fn?n/2,i?)2)
最終答案
(2?∑i=1n(fn,i)2)?(∑i=1n(fn/2,i)2)?(∑i=1n(fn?n/2,i)2)(2*\sum_{i=1}^n(f_{n,i})^2)-(\sum_{i=1}^n(f_{n/2,i})^2)*(\sum_{i=1}^n(f_{n-n/2,i})^2)(2?i=1∑n?(fn,i?)2)?(i=1∑n?(fn/2,i?)2)?(i=1∑n?(fn?n/2,i?)2)
codecodecode
#pragma GCC optimize(2) #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1010,XJQ=999983; ll n,f[N][N*10],Z,ans,m,a[12]; char s[12]; ll C(int x) {ll ans=0;for(int i=0;i<=x*9;i++)if(f[x][i])ans=(ans+(f[x][i]*f[x][i]))%XJQ;return ans; } int main() {scanf("%lld",&n);scanf("%s",s+1);//double star=clock();m=strlen(s+1);for(ll i=1;i<=m;i++)a[i]=s[i]-'0';Z=9*n;f[0][0]=1;for(ll i=0;i<=n;i++)for(ll j=0;j<=Z;j++)if(f[i][j])for(ll k=1;k<=m;k++)f[i+1][j+a[k]]=(f[i+1][j+a[k]]+f[i][j])%XJQ;printf("%lld",(2*C(n)%XJQ-C(n/2)*C(n-n/2)%XJQ+XJQ)%XJQ); }總結
以上是生活随笔為你收集整理的jzoj3056-数字【数位dp,统计,容斥】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英特尔 AMD 寄望 AI PC 提振业
- 下一篇: 欢乐纪中B组周五模拟赛【2019.3.8