这题的主要算法是DP 只在最后结果上用了一下容斥原理
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<set> #include<map> #include<cmath> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<stack> //#define ull unsigned long long #define ll long long using namespace std; const int INF=0x3f3f3f3f; const ll LMOD=999983; const double eps=1e-6; const int N=55; const int M=500; ll dp[N][M]; int a[N]; class CharmingTicketsEasy { public : int count(int n, string good) { int m=good.size(); for(int i=0;i<m;++i) a[i]=good[i]-'0'; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=n;++i) for(int j=0;j<M;++j) for(int w=0;w<m;++w) { if(j-a[w]>=0) dp[i][j]=(dp[i][j]+dp[i-1][j-a[w]])%LMOD; } ll tmp=0; for(int j=0;j<M;++j) tmp=(tmp+dp[n][j]*dp[n][j])%LMOD; ll k1=0; for(int j=0;j<M;++j) k1=(k1+dp[n/2][j]*dp[n/2][j])%LMOD; ll k2=0; if((n&1)==1) { for(int j=0;j<M;++j) k2=(k2+dp[n-n/2][j]*dp[n-n/2][j])%LMOD; }else { k2=k1; } return (int)((tmp+tmp-k1*k2%LMOD+LMOD)%LMOD); } };