1. 程式人生 > >Salazar Slytherin's Locket CodeForces - 855E

Salazar Slytherin's Locket CodeForces - 855E

article pri scan jpg tdi scanf () sta urn

Salazar Slytherin‘s Locket CodeForces - 855E

http://www.cnblogs.com/ftae/p/7590187.html

數位dp:

http://www.cnblogs.com/xz816111/p/4809913.html

http://blog.csdn.net/wust_zzwh/article/details/52100392

1.

 1 #include<cstdio>
 2 #include<cstring>
 3 typedef long long LL;
 4 LL q,b,l,r;
 5 LL ans[11][70
][2049][2]; 6 LL w[70];//記錄拆出來的i進制的各個數字 7 //ans[i][j][state][k]:i進制,i進制下j長度,狀態為state,k表示是否處於前導0 8 //狀態為0-b-1的數字出現奇數/偶數次 9 LL dp(LL jz,LL pos,LL state,bool pre0,bool limit)//pre0表示當前位的前一位是不是0 10 { 11 if(pos<1) return !state;//只有狀態全0也就是所有數字出現偶數次才有1個答案,曾經忘記 12 if(!limit&&ans[jz][pos][state][pre0]!=-1
) 13 return ans[jz][pos][state][pre0]; 14 LL i,res=0,end=limit?w[pos]:(jz-1);//當前位上界,limit為0表示前面某一位已經取了不是最高值,那麽後面的位可以取0-9//曾經把最大值錯寫成9 15 for(i=0;i<=end;i++) 16 if(i==0&&pre0)//如果當前位取0,且前面都是前導0,那麽開頭的0顯然是不計入狀態的 17 res+=dp(jz,pos-1,state,1,limit&&i==w[pos]);//曾經忘記寫limit&&
18 else 19 res+=dp(jz,pos-1,state^(1<<i),0,limit&&i==w[pos]); 20 return limit?res:(ans[jz][pos][state][pre0]=res); 21 } 22 LL get(LL b,LL x) 23 { 24 LL g; 25 for(g=0;x>0;x/=b) w[++g]=x%b; 26 return dp(b,g,0,1,1);//這一種的返回的直接就是1-x的總答案 27 } 28 int main() 29 { 30 memset(ans,-1,sizeof(ans)); 31 scanf("%I64d",&q); 32 while(q--) 33 { 34 scanf("%I64d%I64d%I64d",&b,&l,&r); 35 printf("%I64d\n",get(b,r)-get(b,l-1)); 36 } 37 return 0; 38 }

2.

 1 #include<cstdio>
 2 #include<cstring>
 3 typedef long long LL;
 4 LL q,b,l,r;
 5 LL ans[11][70][2049];
 6 LL w[70];
 7 //ans[i][j][state][k]:i進制,i進制下j長度,狀態為state,k表示是否處於前導0
 8 //狀態為0-b-1的數字出現奇數/偶數次
 9 LL dp(LL jz,LL pos,LL state,bool pre0,bool limit)//pre0表示當前位的前一位是不是0
10 {
11     if(pos<1)    return !state;//只有狀態全0也就是所有數字出現偶數次才有1個答案
12     if(!limit&&!pre0&&ans[jz][pos][state]!=-1)
13         return ans[jz][pos][state];
14     LL i,res=0,start=pre0?1:0,end=limit?w[pos]:(jz-1);//當前位上界,limit為0表示前面某一位已經取了不是最高值,那麽後面的位可以取0-9
15     for(i=start;i<=end;i++)
16         res+=dp(jz,pos-1,state^(1<<i),0,limit&&i==w[pos]);
17     if(!limit&&!pre0)
18         ans[jz][pos][state]=res;
19     return res;
20 }
21 LL get(LL b,LL x)
22 {
23     LL g,i,ret=0;
24     for(g=0;x>0;x/=b)    w[++g]=x%b;
25     for(i=g;i>=1;i--)    ret+=dp(b,i,0,1,i==g);//如果總位數不到g,那麽顯然所有數字都可以隨便取
26     return ret;//這一種的dp返回的是1-x的數中i位的數滿足條件的答案
27 }
28 int main()
29 {
30     memset(ans,-1,sizeof(ans));
31     scanf("%I64d",&q);
32     while(q--)
33     {
34         scanf("%I64d%I64d%I64d",&b,&l,&r);
35         printf("%I64d\n",get(b,r)-get(b,l-1));
36     }
37     return 0;
38 }

3.

技術分享技術分享

Salazar Slytherin's Locket CodeForces - 855E