Uva11361 字首 分區間

2021-06-17 23:22:45 字數 1751 閱讀 2934

這題用的是書上給的思路,不過,對於這種型別的題,做的太少,於是打算好好謝謝。不過,花了乙個晚上,參考別人的**寫了遍。

這種型別的題一般都會用到字首,設f(n)表示從1到n滿足條件的數的個數。但是直接列舉,複雜度為o(n),但是由於範圍最大能達到2^31左右,所以不能暴搞。

這裡將乙個數分成幾部分來算:

f[d][m1][m2]表示除出數的第最高位的數的位數是d,各位數的和模k為m1,該數模k為m2的數字的個數。

f[d][m1][m2]=sum;

而每個數可以劃分成一些f的和。

#include#include#include#include#include#include#define maxn 10005

#define inf 0xfffffff

#define mem(a,b) memset(a,b,sizeof(a))

#define for(i,s,t) for(int i=s;i<=t;i++)

#define ull unsigned long long

#define ll long long

using namespace std;

inline int rd(int &x)

return x;

}int buf[10];

inline void ot(int i)

for(int j=p-1; j>=0; j--) putchar('0'+buf[j]);

}int f[15][100][10005];//數字的長度 各位數和模k 數模k

int count(int x,int k)

int maxd=0,w=1;//記錄最高位後有多少位

while(x/w>=10)

int ret=0,m1=0,m2=0;//m1,m2分別記錄當前位置的前面的數字和及數模k的餘數

for(int i=maxd;i>0;i--)//後面至少有乙個10

else

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

// 最開始的時候只有1位的情況

f[0][i%k][i%k]+=1;

int w=1;

for(int i=1; i<=size; i++)

p[0]=1;

for(int i=1; i<=d; i++)

}int dp(int i,int m1,int m2,int k)

return ret;

}int a[11];

int count(int x,int k)

int d=0;

while(x)

int m1=0,m2=0,ret=0;

for(int i=d-1; i>=0; i--)

else

else

}return 0;

}

遞推:

#include#include#includeusing namespace std;

int f[15][100][10005];

int p[11];

void init(int x,int k)

p[0]=1;

for(int i=1; i=0; i--)

else

else

}return 0;

}

題解 UVA11361 遞推

題目鏈結 設f d,m1,m2 表示共d個數字,其中各數字之和除以k的餘數為m1,這些數字組成的整數除以k的餘數為m2的整數的個數,則每個模板對應的解的個數都等於某個f d,m1,m2 遞推式f d,m1,m2 sum include include typedef long long ll int...

UVA 木塊問題 101

uva 木塊問題 101,好開森好開森。雖然花了很長時間,不過能一次就ac也是蠻開心的,用c 寫效率就是不錯 疊木塊其實是乙個二維空間,每個木塊都有縱橫座標 include include includeusing namespace std block用於記錄木塊所在位置,x是位於哪一疊木塊,y是...

UVA 非常可樂

include include include include include using namespace std struct node int vis 205 205 注意vis陣列用於 int s,n,m int cup left 3 記錄三個杯子中每個杯子的剩餘狀態 int bfs fo...