CF1073E Segment Sum 自閉了
阿新 • • 發佈:2018-10-31
CF1073E Segment Sum
題意翻譯
給定\(K,L,R\),求\(L\)~\(R\)之間最多不包含超過\(K\)個數碼的數的和。
\(K<=10,L,R<=1e18\)
我 寫 暈 了
我 自 閉 了
根本不知道自己在寫什麼????
告辭。。。
錯誤Code:
#include <cstdio> #define ll long long const ll mod=998244353; ll dp[2][20][1<<10],cnt[2][20][1<<10],po[20],l,r; int k; void init() { po[0]=1; for(int i=1;i<=18;i++) po[i]=po[i-1]*10%mod; cnt[0][0][0]=1; for(int i=1;i<=18;i++) for(int s=0;s<1<<10;s++) { for(int j=1;j<=9;j++) if(s>>j&1) { int t=(1<<j)^s; (cnt[1][i][s]+=(cnt[0][i-1][s]+cnt[1][i-1][s] +cnt[0][i-1][t]+cnt[1][i-1][t]))%=mod; } int t=s^1; if(s&1) (cnt[0][i][s]+=(cnt[0][i-1][s]+cnt[1][i-1][s] +cnt[0][i-1][t]+cnt[1][i-1][t]))%=mod; } for(int i=1;i<=18;i++) for(int s=0;s<1<<10;s++) { for(int j=1;j<=9;j++) if(s>>j&1) { int t=(1<<j)^s; ll tmp0=(cnt[0][i-1][s]+cnt[1][i-1][s] +cnt[0][i-1][t]+cnt[1][i-1][t])%mod; ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s] +dp[0][i-1][t]+dp[1][i-1][t])%mod; (dp[1][i][s]+=(tmp1+j*po[i-1]%mod*tmp0))%=mod; } if(s&1) { int t=s^1; ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s] +dp[0][i-1][t]+dp[1][i-1][t])%mod; dp[0][i][s]=tmp1; } } } int bit[20]; ll solve(ll d) { int rt=0; for(ll i=d;i;i/=10) bit[++rt]=i%10; int cho=0;//高位已選狀態 ll res=0,ans=0;//高位剩餘 for(int i=rt;i;i--) { for(int s=0;s<1<<10;s++) { int ct=0; for(int t=s;t;t>>=1) ct+=t&1; if(ct>k+1) continue; if(s&1) { int t=s^1; ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s] +dp[0][i-1][t]+dp[1][i-1][t])%mod; ans+=tmp1; } if(ct>k) continue; for(int j=1;j<bit[i]+(i==1);j++)//高位選填 if((s>>j&1)&&((s|cho)==s)) { int t=(1<<j)^s; ll tmp0=(cnt[0][i-1][s]+cnt[1][i-1][s] +cnt[0][i-1][t]+cnt[1][i-1][t])%mod; ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s] +dp[0][i-1][t]+dp[1][i-1][t])%mod; (ans+=tmp1+tmp0*(j+res)%mod*po[i-1]%mod)%=mod; } } res=(res+bit[i])*10%mod; cho|=1<<bit[i]; } return ans; } int main() { scanf("%lld%lld%d",&l,&r,&k); init(); printf("%lld\n",((solve(r)-solve(l-1))%mod+mod)%mod); return 0; }