正题
题目大意
求有多少个2∗n2*n2∗n位的数字(允许有前导零)满足
- 只包含SSS集合内的数字
- 前nnn位的和等于后nnn位之和或者奇数位之和和偶数位之和相等
解题思路
预处理数组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∑mfi,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);
}