數字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...