---恢复内容开始---
https://www.luogu.org/problem/P4163
给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。
注意是所有数字都要用上
#include<iostream> #include<cstdio> #include<cstring> #define ri register int #define u long long #define NN 1005 using std::string; using std::cin; namespace all { u a[15],k,len,ans,t; void dfs(const u &x,const u &n){ if(n==len&&((x/k)*k==x)) ++ans; for(ri i(0);i<=9;++i){ if(a[i]){ --a[i]; dfs(x*10+i,n+1); ++a[i]; } } } inline void solve(){ u N; cin>>N; for(ri cas(1);cas<=N;++cas){ string _s; ans=0; cin>>_s>>k; len=(_s.length()); memset(a,0,sizeof(a)); for(ri i(0);i<len;++i) ++a[_s[i]-'0']; dfs(0,0); printf("%d ",ans); } } } int main() { //freopen("x.txt","r",stdin); all::solve(); }
---恢复内容结束---
#include<iostream>
#include<cstdio>
#include<cstring>
#define ri register int
#define u long long
#define NN 1005
using std::string;
using std::cin;
namespace all {
u a[15],k,len,ans,t;
void dfs(const u &x,const u &n){
if(n==len&&((x/k)*k==x)) ++ans;
for(ri i(0);i<=9;++i){
if(a[i]){
--a[i];
dfs(x*10+i,n+1);
++a[i];
}
}
}
inline void solve(){
u N;
cin>>N;
for(ri cas(1);cas<=N;++cas){
string _s;
ans=0;
cin>>_s>>k;
len=(_s.length());
memset(a,0,sizeof(a));
for(ri i(0);i<len;++i) ++a[_s[i]-'0'];
dfs(0,0);
printf("%d
",ans);
}
}
}
int main() {
//freopen("x.txt","r",stdin);
all::solve();
}