乍一看好像是道數字dp;然而要求的是平方和。
在暫時沒有其他思路的情況下——能不能用數字dp做平方和?
數字dp在搜尋的時候是這麼個樣子的:比如說
abcdefghi
現在搜到:
9982|e|fghi
那麼現在確定了前面的9982,當前這一位和之後的fghi 都不確定。
在這一位上的搜尋結果就覆蓋了efghi 所有的可**況
那麼很顯然地,要求數的平方和也就是這個(9982efghi)的平方和
所以就是(998200000+efghi)的平方和。這個可以拆。
拆出來三個都可以求。
(998200000²想必不用多說;
2×998200000×efghi只需要知道sum(efghi),這個也好求;
efghi²呢?注意到這也是平方和,改變現在的問題讓這個變成子問題就好了。)
現在這道題目被拆解為六塊,分別是三個條件和三個返回值。
三個條件:
1.不能有某一位是7;
2.數字和不被7整除;
3.數不被7整除
對應的方法:
1.在列舉當前數字的時候直接跳過
if (i==7) continue;
2.傳遞數字和對7取模的餘數sum
3.傳遞(當前確定下來的一部分)數對7取模的餘數ori
if (!pos) ... sum && ori ...
三個值:
1.滿足條件數的個數cnt
2.滿足條件數的和sum
3.滿足條件數的平方和sqsum
對應地,列舉令 pos 位置上的值為 i,有方程:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include 11 #include 12 #include 13
using
namespace
std;
14 typedef long
long
ll;15
const
int maxn=20;16
const ll mod=(ll)(1e9+7
);17
ll bit[maxn],tp[maxn];
1819
struct
node
24}f[maxn][maxn][maxn];
2526 node dfs(int pos,int sum,int ori,bool lead,bool limit)
42return (!limit&&!lead) ? f[pos][sum][ori] =tmp: tmp;43}
4445
ll solve(ll x)
51return dfs(bit[0],0,0,1,1
).sqsum;52}
5354
intmain()
5566
return0;
67 }
吉哥系列故事 恨7不成妻
題意 輸入t組數,每組有兩個數,求出n m區間內不含有7且不能被7整除且各個位數相加之和不被7整除的數的平方和。資料在1 1e18,結果對1e9 7。由於數太大,容易溢位,所以比較麻煩的是要把數拆開。include include include include include include in...
題解 吉哥系列故事 恨7不成妻
description 單身 依然單身!吉哥依然單身!ds級碼農吉哥依然單身!所以,他生平最恨情人節,不管是214還是77,他都討厭!吉哥觀察了214和77這兩個數,發現 2 1 4 7 7 7 7 2 77 7 1 最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至討厭一切和7有關的...
B 吉哥系列故事 恨7不成妻
單身 依然單身!吉哥依然單身!ds級碼農吉哥依然單身!所以,他生平最恨情人節,不管是214還是77,他都討厭!吉哥觀察了214和77這兩個數,發現 2 1 4 7 7 7 72 77 711 最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至討厭一切和7有關的數!什麼樣的數和7有關呢?...