版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/88361756
正题
题目大意
求有多少个 位的数字(允许有前导零)满足
- 只包含 集合内的数字
- 前 位的和等于后 位之和或者奇数位之和和偶数位之和相等
解题思路
预处理数组
表示
位数,数字之和为
时的方案数。
动态转移方程
然后我们若不考虑两种情况重合答案就是
那我们考虑重合,那么就是奇数位等于偶数位之和且前
位等于后
位之和的情况。我们可以转换为:
前
位中奇数位之和
后
位中偶数位之和
且
前
位中偶数位之和
后
位中奇数位之和
这种情况就是
最终答案
#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);
}