狀壓DP 暴力搜尋 排列perm

2022-02-18 01:32:18 字數 1660 閱讀 1751

給乙個數字串 s 和正整數 d, 統計 sss 有多少種不同的排列能被 d 整除(可以有前導 0)。例如 123434 有 90 種排列能被 2 整除,其中末位為 2 的有 30 種,末位為 4 的有 60 種。

輸入第一行是乙個整數 ttt,表示測試資料的個數,以下每行一組 s 和 d,中間用空格隔開。s 保證只包含數字 0,1,2,3,4,5,6,7,8,9

每個資料僅一行,表示能被 d 整除的排列的個數。

輸入 #1

7000 1

001 1

1234567890 1

123434 2

1234 7

12345 17

12345678 29

輸出 #113

3628800903

61398

100% 的資料滿足:s 的長度不超過 10,1≤d≤1000,1≤t≤15。

在前三個例子中,排列分別有 1,3,36288001 種,它們都是 1 的倍數。

s的長度很短,不是暴搜就是狀壓,然鵝這道題都可以用

大多數狀壓中都是當前某個狀態對之後於此相關狀態產生影響

因此可以對整個序列的長度進行狀壓,詳見**

#include#include#include#include#include#includeusing namespace std;

const int maxn=(1<<10)+5,inf=0x3f3f3f3f;

int n,m,f[maxn][1000],sum[11],mol,a[maxn],vis[maxn];

char str[1000];

inline int read()

while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();

return s*w;

}int main()

int maxs=(1《相對於狀壓而言,暴搜更好想一些,就是從低位依次列舉至高位,但是時間消耗更大,洛谷上會t兩個點,可能剪剪枝會過

#include#include#include#include#include#includeusing namespace std;

const int maxn=(1<<10)+5,inf=0x3f3f3f3f;

int n,m,f[maxn][1000],sum[11],mol,a[maxn],vis[maxn],ans;

char str[1000];

inline int read()

while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();

return s*w;

}void dfs(int now,long long x)

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

int main()

while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();

return s*w;

}int main()

while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();

return s*w;

}int main()while(next_permutation(str,str+n));

cout<}}

狀壓DP之排列perm

scoi2007 排列 給乙個數字串s和正整數d,統計s有多少種不同的排列能被d整除 可以有前導0 例如123434有90種排列能被2整除,其中末位為2的有30種,末位為4的有60種。輸入第一行是乙個整數t,表示測試資料的個數,以下每行一組s和d,中間用空格隔開。s保證只包含數字0,1,2,3,4,...

BZOJ1072 排列perm 狀壓dp

給乙個數字串s和正整數d,統計s有多少種不同的排列能被d整除 可以有前導0 例如123434有90種排列能 被2整除,其中末位為2的有30種,末位為4的有60種。輸入第一行是乙個整數t,表示測試資料的個數,以下每行一組s和d,中間用空格隔開。s保證只包含數字0,1 2,3,4,5,6,7,8,9.每...

排列(STL函式運用 狀壓dp)

題目描述 給乙個數字串s和正整數d 統計s有多少種不同的排列能被d整除 可以有前導0 例如123434有90種排列能被2整除,其中末位為2 的有 30種,末位為4 的有60種。輸入格式 輸入第一行是乙個整數t,表示測試資料的個數,以下每行一組 s和 d,中間用空格隔開。s保證只包含數字0,1,2,3...