AcWing 1084 數字遊戲 II

2021-10-03 05:37:32 字數 1340 閱讀 8974

題目描述:

由於科協裡最近真的很流行數字遊戲。

某人又命名了一種取模數,這種數字必須滿足各位數字之和 mod n為 0。

現在大家又要玩遊戲了,指定乙個整數閉區間 [a.b],問這個區間內有多少個取模數。

輸入格式

輸入包含多組測試資料,每組資料佔一行。

每組資料報含三個整數 a,b,n。

輸出格式

對於每個測試資料輸出一行結果,表示區間內各位數字和 mod n為 0 的數的個數。

資料範圍

1≤a,b≤2^31−1,

1≤n<100

輸入樣例:

1 19 9
輸出樣例:

2
分析:

方法一:動態規劃

首先如果用f[i][j]表示乙個以j開頭的i位數中各位數字之和能被n整除的數的個數的話,則不太好從f[i-1][k]遞推過來,事實上,本題的條件是mod n為0,則所有的數根據各位之和模上n結果的不同被劃分為n個不同的等價類。所以可以再加上一維表示各位之和模上n的結果,即f[i][j][k]表示乙個以j開頭的i位數中各位數字之和模上n等於k的數的個數。則狀態轉移方程為f[i][j][k] += f[i-1][t][s],其中t表示對第i-1位上數的列舉,(s + j) mod n == k,即s = (k - j) % n,由於k-j可能是負數,所以需要令s = (k - j % n + n) % n將控制在0到n-1之間。後面每位的列舉過程和之前的題目類似,如果當前位置上的數小於n對應位置上的數,則方案數直接加上f[i+1][j][(mod-last) % mod],last表示前面位置上的數之和模上mod的數(mod就是前面提到的n),則為了這個數模上mod為0,以j開頭剩下位置上的數模上mod應該就是(mod-last) % mod了。列舉到最後一位如果last恰好為0,res++。實現的細節見**:

#include #include #include using namespace std;

const int n = 12;

int f[n][n][100],mod;

void init()}}

}}int get(int n)

return res;

}int main()

int res = 0;

for(int i = 0;i <= 9;i++)

else res += dfs(u - 1,t,0);

}return f[u][s][flag] = res;

}int get(int n)

int main()

return 0;

}

AcWing1084 數字遊戲II(數字dp)

y總的數字dp板子有點東西的,沒有用記憶化搜尋這東西。這題還是套板子,因為是模數,所以我們還是考慮建立狀態為f,表示前i個,最高位填j,模為k的值 include include include include using namespace std const int n 1e5 10 int f...

Acwing 1082 數字遊戲

數字 dp 問題往往都是這樣的題型,給定乙個閉區間 l,r 讓你求這個區間中滿足某種條件的數的總數。字首和思想,轉化為 f 0,r f 0,l 1 求解。轉化成求 f n 將上限n轉化成10進製 根據題意轉化為k進製,一般是十進位制 列舉從最高位開始列舉n的10進製的每一位,只要該位的取值小於n的1...

AcWing 1082 數字遊戲

題目傳送門 include using namespace std const int n 20 int a n 數字分離的陣列 int dp n n dp pos pre 表示當前第pos位,pre是指前一位是什麼,這個因素制約了後面的取值個數 功能 統計 0 pos 之間答案 param pos...