1. 程式人生 > >HDU 4507 吉哥系列故事――恨7不成妻(數位DP+結構體)

HDU 4507 吉哥系列故事――恨7不成妻(數位DP+結構體)

開始 bsp 相等 continue 退出 tin get 結構 eof

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4507

題目大意:如果一個整數符合下面3個條件之一,那麽我們就說這個整數和7有關

    1、整數中某一位是7;
    2、整數的每一位加起來的和是7的整數倍;
    3、這個整數是7的整數倍;
    求一定區間內和7無關的數字的平方和。

解題思路:這裏我們用一個結構體分別存儲符合條件的數的個數n,從當前位開始至末尾的數值s(比如一個數當前為1234***,*表示還不知道的位值,代表的就是***),從當前位開始至末尾的數的平方和sq(比如一個數當前為1234***,代表的就是(***)x(***))。我們用結構體dp[pos][mod1][mod2]來記錄狀態。因為可以保證如果當前位置!滿足limit並且mod1和mod2都相等,那麽最後的得到的sq都是相同的。

我們可以利用下一位的n,s,sq,退出上一位n,s,sq,其間存在遞推關系。比如234(n=1,s,sq)怎麽推到6234?那就是s2=s+6*10^3,sq=2*(6*10^3)*234+(6*10^3)*(6*10^3);

代碼:

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 typedef unsigned long long ll;
 6 const ll MOD=1e9+7;
 7 int a[25];
 8 ll power[25
]; 9 struct node{ 10 ll n,s,sq;//符合條件的數的個數,各位值之和,平方和 11 }dp[25][10][10]; 12 13 node dfs(ll pos,ll mod1,ll mod2,bool limit){//每次的value不一樣,不能直接存平方和的值之和 14 if(pos==0){ 15 node t; 16 t.n=(mod1&&mod2); 17 t.s=t.sq=0; 18 return t; 19 } 20 if(!limit&&dp[pos][mod1][mod2].n!=-1
) return dp[pos][mod1][mod2]; 21 node ans,temp; 22 ans.n=ans.s=ans.sq=0; 23 int up=limit?a[pos]:9; 24 for(int i=0;i<=up;i++){ 25 if(i==7) continue; 26 temp = dfs(pos-1,(mod1*10+i)%7,(mod2+i)%7,limit && (i == up)); 27 ans.n=(ans.n + temp.n)%MOD; 28 ans.s=(ans.s+temp.s+((i*power[pos])%MOD *temp.n) % MOD) % MOD; 29 ans.sq=(ans.sq+temp.sq+((2*i*power[pos])%MOD*temp.s)%MOD)%MOD; 30 ans.sq=(ans.sq+(((i*i*power[pos])%MOD*power[pos])%MOD*temp.n)%MOD)%MOD; 31 } 32 if(!limit) dp[pos][mod1][mod2]=ans; 33 return ans; 34 } 35 36 ll solve(ll n){ 37 ll top=0; 38 while(n){ 39 a[++top]=n%10; 40 n/=10; 41 } 42 node ans=dfs(top,0,0,true); 43 return ans.sq; 44 } 45 46 int main(){ 47 memset(dp,-1,sizeof(dp)); 48 power[1]=1; 49 for(int i=2;i<=19;i++){ 50 power[i]=(power[i-1]*10)%MOD; 51 } 52 int t; 53 scanf("%d",&t); 54 while(t--){ 55 ll l,r,ans; 56 scanf("%lld %lld",&l,&r); 57 ans=(solve(r)-solve(l-1)+MOD)%MOD;//可能出現負數,所以要補回來 58 printf("%lld\n",ans); 59 } 60 return 0; 61 }

HDU 4507 吉哥系列故事――恨7不成妻(數位DP+結構體)