這個題,跟標準模板就有很多的不一樣了,主要體現在數學的計算上面
題意:區間【l,r】內,與7數字無關的數的平方和
無關的定義是:該數不含7,不能被7整除,各個數字之和不是7的倍數
分析:如果是統計符合某種性質的數的個數,那麼很簡單
不含7,在數字列舉的時候遇到7跳過就好
被7整除和數字之和是7的倍數,都是在數字列舉完了之後,記憶化的時候乙個if判斷就好
就是模板
統計數的和的題都沒有做過,直接上平方和,怎麼做呢?
很簡單:先從和來想
之前有多少個數符合了要求,每個數字上的值是多少,先加起來
平方和呢:(a+b)^2=a^2+b^2+2*a*b
(a + b)^2 = a^2 + 2*a*b + b^2可以得出(數字上的對應值 * (能滿足的條件的數的數量) + 2 * sigma((每個分支下面滿足條件的數量)*(分支和)) + sigma(分支平方和)。
所以,要求平方和,各個數的和也得先求出來
按照這個思路,dp【pos】【sum】【num】就需要做改動,變成乙個結構體
需要儲存三個數:當前滿足條件的數的個數,數的和,數的平方和
所以,需要預處理每乙個數字上的值,每個數字在表示數的時候是有權值的,十位數上的數權重為10,以此類推
預處理權重陣列
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define ll rt<<1
#define rr rt<<1|1
#define ll long long
#define ull unsigned long long
#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
const long long mod=1000000007ll;
struct nodedp[20][10][10];
int digit[20];
long long p[20];
node dfs(int pos,int sum,int num,bool flag)
if (flag&&dp[pos][sum][num].cnt!=-1) return dp[pos][sum][num];
int maxnumber=flag?9:digit[pos];
ans.cnt=ans.sum=ans.sqsum=0;
for(int i=0;i<=maxnumber;i++){
if (i==7) continue;
tmp=dfs(pos-1,(sum+i)%7,(num*10+i)%7,flag||i
HDU 4507 恨7不成妻
problem description 單身 依然單身!吉哥依然單身!ds級碼農吉哥依然單身!所以,他生平最恨情人節,不管是214還是77,他都討厭!吉哥觀察了214和77這兩個數,發現 2 1 4 7 7 7 7 2 77 7 11 最終,他發現原來這一切歸根到底都是因為和7有關!所以,他現在甚至...
HDU 4507 恨7不成妻(數字dp )
題目 求在一定區間內和7無關的數字的平方和。如果乙個整數符合下面3個條件之一,那麼我們就說這個整數和7有關 1 整數中某一位是7 2 整數的每一位加起來的和是7的整數倍 3 這個整數是7的整數倍 基本思想是 x y 2 x 2 2 x y y 2 維護sum和sqrt sum,以及數量cnt來確定用...
HDU4507 恨7不成妻(數字dp)
給定區間 l r 1 leq l r leq 1e18 求在區間中滿足下列條件的所有數x的平方和 不存在數字7 不是7的倍數 每一位的數字的和也不是7的倍數 數字dp 狀態 位置i,數對7取模j,各個位的和對7取模 是否頂上界 下面的 用記憶化搜尋方式實現,從低位向高位遞進。已知後面i位數滿足的平方...