f[i][j]表示选了i状态的位置上的数,余数为j的方案数。
最后用排列组合的知识去一下重(除掉同一个数的顺序)
复杂度
O(T∗2nm)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 15
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,mod,dp[1025][1000],a[N],num[N],fac[N],bin[N];
char s[N];
int main(){
// freopen("a.in","r",stdin);
int tst=read();fac[0]=1;bin[0]=1;
for(int i=1;i<=10;++i) bin[i]=bin[i-1]<<1;
for(int i=1;i<=10;++i) fac[i]=fac[i-1]*i;
while(tst--){
scanf("%s",s);n=strlen(s);memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));dp[0][0]=1;mod=read();
for(int i=0;i<n;++i){
a[i]=s[i]-'0';num[a[i]]++;
}for(int i=0;i<=bin[n]-1;++i)
for(int j=0;j<mod;++j){
if(!dp[i][j]) continue;
for(int k=0;k<n;++k){
if(bin[k]&i) continue;
dp[i|bin[k]][(j*10+a[k])%mod]+=dp[i][j];
}
}for(int i=0;i<=9;++i) dp[bin[n]-1][0]/=fac[num[i]];
printf("%d\n",dp[bin[n]-1][0]);
}return 0;
}