HDU 4507 吉哥系列故事 恨7不成妻

2021-07-10 13:20:06 字數 1710 閱讀 3049

數字dp專題:

題意:統計在[l,r]區間內所有與7無關數字的平方和。

什麼樣的數和7有關呢?

如果乙個整數符合下面3個條件之一,那麼我們就說這個整數和7有關——

1、整數中某一位是7;

2、整數的每一位加起來的和是7的整數倍;

3、這個整數是7的整數倍;

思路:如果是統計區間內數的個數就比較簡單,那麼我們來考慮一下怎麼去統計平方和。

假設當前列舉第k位的值是i,那麼我們需要計算以i開頭的數字的平方和。

平方和公式展開(i+y)² = i² + 2 * i * y + y² 如果有t個以i開頭的數的話,就是n * i² + 2 * i * ∑y + ∑(y²) 這裡的i表示i*10^(k-1)

所以我們在一層中去維護三個值,乙個出現次數,乙個當前層的所有滿足數的和,還有乙個平方和。每次通過下一次dfs返回的值來更新當前層的值,再返回

到上一層。注意乘的時候不要一次乘太多再取模,防止溢位。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)

#define rrep(i,j,k) for (int i=j;i>=k;i--)

#define clean(x,y) memset(x,y,sizeof(x))

#define ll long long

#define ull unsigned long long

#define inf 0x7fffffff

const long long mod=1000000007ll;

struct node

};node dp[20][10][10];

int bit[20];

ll p[20];

int t;

ll l,r;

node dfs(int k , int yu , int sum , bool flag)

if ( !flag && dp[k][yu][sum].t != -1 ) return dp[k][yu][sum];

node ans;

node temp;

int ed = flag?bit[k]:9;

rep(i,0,ed)

if ( !flag ) dp[k][yu][sum] = ans;

return ans;

}ll cal(ll x)

node ans = dfs(len,0,0,1);

return ans.squre_sum;

}int main()

{ p[1] = 1;

rep(i,2,19) p[i] = ( 10 * p[i-1] ) % mod;

clean(dp,-1);

cin>>t;

while(t--)

{scanf("%i64d %i64d",&l,&r);

// cout<

HDU4507 吉哥系列故事 恨7不成妻

單身 依然單身!吉哥依然單身!ds級碼農吉哥依然單身!所以,他生平最恨情人節,不管是214還是77,他都討厭!吉哥觀察了214和77這兩個數,發現 2 1 4 7 7 7 7 2 77 7 11 最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至討厭一切和7有關的數!什麼樣的數和7有關...

吉哥系列故事 恨7不成妻 HDU 4507

hdu 4507 單身 依然單身!吉哥依然單身!ds級碼農吉哥依然單身!所以,他生平最恨情人節,不管是214還是77,他都討厭!吉哥觀察了214和77這兩個數,發現 2 1 4 7 7 7 7 2 77 7 11 最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至討厭一切和7有關的數!...

HDU 4507 吉哥系列故事 恨7不成妻

題目鏈結 如果乙個整數符合下面 3 個條件之一,那麼我們就說這個整數和7有關 1 整數中某一位是 7 2 整數的每一位加起來的和是 7 的整數倍 3 這個整數是 7 的整數倍 現在問題來了 吉哥想知道在一定區間內和7無關的數字的平方和。l,r leq 10 具體請見題目 典型的數字dp題目。考慮 f...