正题
题目大意
求有多少个 2 ∗ n 2*n 2∗n位的数字(允许有前导零)满足
- 只包含 S S S集合内的数字
- 前 n n n位的和等于后 n n n位之和或者奇数位之和和偶数位之和相等
解题思路
预处理数组
f
i
,
j
f_{i,j}
fi,j表示
i
i
i位数,数字之和为
j
j
j时的方案数。
动态转移方程
f
i
,
j
=
∑
k
=
1
m
f
i
,
j
−
a
k
f_{i,j}=\sum_{k=1}^mf_{i,j-a_k}
fi,j=k=1∑mfi,j−ak
然后我们若不考虑两种情况重合答案就是
2
∗
∑
i
=
1
n
(
f
n
,
i
)
2
2*\sum_{i=1}^n(f_{n,i})^2
2∗i=1∑n(fn,i)2
那我们考虑重合,那么就是奇数位等于偶数位之和且前
n
n
n位等于后
n
n
n位之和的情况。我们可以转换为:
前
n
n
n位中奇数位之和
=
=
=后
n
n
n位中偶数位之和
且
前
n
n
n位中偶数位之和
=
=
=后
n
n
n位中奇数位之和
这种情况就是
(
∑
i
=
1
n
(
f
n
/
2
,
i
)
2
)
∗
(
∑
i
=
1
n
(
f
n
−
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
=
1
n
(
f
n
,
i
)
2
)
−
(
∑
i
=
1
n
(
f
n
/
2
,
i
)
2
)
∗
(
∑
i
=
1
n
(
f
n
−
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)
c o d e code code
#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);
}