題目鏈結
如果乙個整數符合下面\(3\)個條件之一,那麼我們就說這個整數和7有關——
1、整數中某一位是\(7\);
2、整數的每一位加起來的和是\(7\)的整數倍;
3、這個整數是\(7\)的整數倍;
現在問題來了:吉哥想知道在一定區間內和7無關的數字的平方和。
\(l,r\leq 10^\)
具體請見題目
典型的數字dp題目。
考慮\(f[p,s,v]\)表示數字\(p\),各位和對\(7\)取模是\(s\),數對\(7\)取模是\(v\)的方案數。
那麼在搜尋的過程中只要避開\(7\)的分支,並在搜到葉節點的時候判斷是否滿足條件\(2,3\)即可。
如果是和顯然很好求。平方和需要用到額外的東西。
完全平方公式。
大概是初二的時候教了這東西吧。完全沒想到它。\((a+b)^2=a^2+b^2+2ab\)
那麼利用這個公式。我們就可以在中途維護這個平方和了。
對\(f\)陣列維護三個量:\(cnt\)表示合法的數的個數,\(sum\)表示合法的數的和,\(sumq\)表示合法的數的平方和。
那麼在回溯過程中對\(cnt\)和\(sum\)累加,對\(sumq\)利用完全平方公式處理即可。
**如下:
#include using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
ll num[23], cnt, po[23];
ll l, r;
struct task
//cnt 個數 sumq 平方和 sum和
//(a+b)^2=a^2+b^2+2ab
}f[23][23][23];
void init()
} }}task dfs(int pos, bool done, ll sum, ll v)
if(!done && f[pos][sum][v].cnt != -1) return f[pos][sum][v];
ll ed = done ? num[pos] : 9; task res;
res.cnt = 0;
for(ll i = 0; i <= ed; ++i)
if(done) return res;
return f[pos][sum][v] = res;
}ll count(ll x)
int main()
return 0;
}
HDU 4507 吉哥系列故事 恨7不成妻
數字dp專題 題意 統計在 l,r 區間內所有與7無關數字的平方和。什麼樣的數和7有關呢?如果乙個整數符合下面3個條件之一,那麼我們就說這個整數和7有關 1 整數中某一位是7 2 整數的每一位加起來的和是7的整數倍 3 這個整數是7的整數倍 思路 如果是統計區間內數的個數就比較簡單,那麼我們來考慮一...
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有關的數!...