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

2021-09-10 15:28:58 字數 2851 閱讀 4483

hdu - 4507 

單身! 

依然單身! 

吉哥依然單身! 

ds級碼農吉哥依然單身! 

所以,他生平最恨情人節,不管是214還是77,他都討厭! 

吉哥觀察了214和77這兩個數,發現: 

2+1+4=7 

7+7=7*2 

77=7*11 

最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至討厭一切和7有關的數! 

什麼樣的數和7有關呢? 

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

1、整數中某一位是7; 

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

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

現在問題來了:吉哥想知道在一定區間內和7無關的數字的平方和。 

input

輸入資料的第一行是case數t(1 <= t <= 50),然後接下來的t行表示t個case;每個case在一行內包含兩個正整數l, r(1 <= l <= r <= 10^18)。 

output

請計算[l,r]中和7無關的數字的平方和,並將結果對10^9 + 7 求模後輸出。

sample input

3

1 910 11

17 17

sample output

236

2210

思路:

利用數字dp

參考自己的一些補充:

與7不沾邊的數需要滿足三個條件。

①不出現7

②各位數和不是7的倍數

③這個數不是7的倍數

這三個條件都是基礎的數字dp。

但是這題要統計的不是符合條件個數,而是平方和。

也就是說在dp時候,要重建每個數,算出平方,然後求和。

需要維護三個值(推薦使用結構體), 假定dfs推出返回的結構體是next,當前結果的結構體是ans

①符合條件數的個數 cnt

②符合條件數的和 sum

③符合新增數的平方和 sqsum

其中①是基礎數字dp。②next.sum+(10^len*i)*next.cnt,其中(10^len*i)*next.cnt代表以len為首位的這部分數字和。

③首先重建一下這個數,(10^len*i+x),其中x是這個數的後面部分,則平方和就是(10^len*i)^2+x^2+2*10^len*i*x,首先需要注意的是x表示的是某乙個數字,而不是上面說的next.sum, 兩者是不對等的。

整體還要乘以next.cnt,畢竟不止乙個。其中x^2*next.cnt=next.sqsum

這樣sqsum+=next.sqsum

sqsum+=(2*10^len*i*x)*next.cnt=(2*10^len*i)*next.sum(神奇的化簡)

sqsum+=(10^len*i)^2*next.cnt

最後可以知道

x^2 * next.cnt = next.sqsum

x*next.cnt = next.sum

其中 x 表示某乙個數字的右邊較小幾位的值 比如234 那麼x就是34 ,此時的平方和就是(34+ 2*10^2)^2  。

其實這兩個等式一直是比較疑惑的地方,但是隨便舉幾個例子確實相等。

現在理解 :x*next.cnt = next.sum

如上式子 next.sum+(10^len*i)*next.cnt

我們可以知道等式    next.sum+(10^len*i)*next.cnt =(10^len*i+x)*next.cnt

所以有    x*next.cnt = next.sum

接下來理解 :x^2 * next.cnt = next.sqsum

比如 12 , 在迭代到 i =1時,那麼對應的有 10,11,12 這三個數字 平方和就是(10+0)^2+(10+1^2)^2+(10+2^2)^2

那麼其中的 x 就分別表示 0、1、2 就是對應的x^2 ,最終 0^2 +1^2+2^2=5 就是等於這個數字第十位的後面部分,也就是個位

的平方和 = next.sqsum。

**:

#include#include#includetypedef long long ll;

using namespace std;

int caset;

ll a,b;

int digit[20];

ll pow[25];

const ll mode = 1e9+7;

struct node

node(ll x,ll y,ll z):num(x),sum(y),sqsum(z){};

};//其中表示三個狀態

// pos 對應的數字

// re1 表示每一位加和%7 的結果,所以只要7個空間就夠了

// val 表示這個整數是7的整數倍 %7 的結果

node dp[20][10][10]; //pos , res ,val

//其中表示三個狀態

// pos 對應的數字

// re1 表示每一位加和%7 的結果,所以只要7個空間就夠了

// val 表示這個整數是7的整數倍 %7 的結果

node dfs(int pos,int re1,int val,bool limit)

if(!limit) dp[pos][re1][val] = ans;

return ans;

}ll solve(ll x)

node res = dfs(pos-1,0,0,true);

return res.sqsum;

}int main()

return 0;

}

記得注意取模的地方

吉哥系列故事 恨7不成妻

乍一看好像是道數字dp 然而要求的是平方和。在暫時沒有其他思路的情況下 能不能用數字dp做平方和?數字dp在搜尋的時候是這麼個樣子的 比如說 abcdefghi 現在搜到 9982 e fghi 那麼現在確定了前面的9982,當前這一位和之後的fghi 都不確定。在這一位上的搜尋結果就覆蓋了efgh...

吉哥系列故事 恨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有關的...