假設我們當前列舉到的第i位,且第i位上的數字是x,那麼對於答案中的第i位數字j來說,可以填兩類數:
如何處理f陣列呢?f[i
][j]
[k]f[i][j][k]
f[i][j
][k]
表示一共有i位,且最高位數字是j,且(所有位數字之和模n後的結果為k)的數的個數。
狀態轉移:
因為第i位已經填了j,且所有位數字之和模n的結果為k,所以我們考慮第i-1位,假設第i-1位上填的數字是x,由於j已經知道了,即j_ _ _,那麼剩下的i-1位數字之和模n的結果就是(k−
j)%n
(k-j)\%n
(k−j)%
n,由於模n,因此得到的餘數範圍0≤k
對於c++語言來說,正數取模會得到正數,但是負數取模會得到負數,為了防止負數取模得到負數,我們可以用(a%
b+b)
%b(a\%b+b)\%b
(a%b+b
)%b的方法來解決。
#include#include#includeusing namespace std;
const int n=12,m=102;
//f[i][j][k]表示一共有i位,最高位數字是j,且所有位數字之和模p的結果為k的數的個數
int f[n][10][m];
int p; //模數
//因為對於c++來說,負數取模會得到負數,為了防止得到的是負數,可以這麼寫
int mod(int a,int b)
//預處理
void init()
int res=0;//答案
int last=0;//前面位的數字之和
//從高位一直列舉到低位
for(int i=nums.size()-1;i>=0;i--)
{int x=nums[i];//取出當前位的數字
//走左側分支
//第i位可以放[0,x-1]中的數字
for(int j=0;j>l>>r>>p)
{init();
cout <
數字遊戲 II
由於科協裡最近真的很流行數字遊戲。某人又命名了一種取模數,這種數字必須滿足各位數字之和 mod nmod n 為 00。現在大家又要玩遊戲了,指定乙個整數閉區間 a.b a.b 問這個區間內有多少個取模數。輸入格式 輸入包含多組測試資料,每組資料佔一行。每組資料報含三個整數 a,b,na,b,n。輸...
AcWing 1084 數字遊戲 II
題目描述 由於科協裡最近真的很流行數字遊戲。某人又命名了一種取模數,這種數字必須滿足各位數字之和 mod n為 0。現在大家又要玩遊戲了,指定乙個整數閉區間 a.b 問這個區間內有多少個取模數。輸入格式 輸入包含多組測試資料,每組資料佔一行。每組資料報含三個整數 a,b,n。輸出格式 對於每個測試資...
AcWing1084 數字遊戲II(數字dp)
y總的數字dp板子有點東西的,沒有用記憶化搜尋這東西。這題還是套板子,因為是模數,所以我們還是考慮建立狀態為f,表示前i個,最高位填j,模為k的值 include include include include using namespace std const int n 1e5 10 int f...