HDOJ4507 恨7不成妻

2021-07-11 20:59:52 字數 1510 閱讀 3547

這個題,跟標準模板就有很多的不一樣了,主要體現在數學的計算上面

題意:區間【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位數滿足的平方...