题目链接:http://codeforces.com/problemset/problem/401/D
题意:问给出的数位的全排列组成的数当中,那些数模m等于0.
思路:二进制表示选了哪些数,f[i][j]表示选了i表示的那些数,余数为j的方案数.
直接状压DP或者记忆化搜索都可以,搜索比较好理解.
代码:
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 2e5+5;
const double eps = 1e-12;
const int inf = 0x3f3f3f3f;
map<int,int>::iterator it;
int a[25],n,m;
ll f[300000][101];
int main()
{
ll t;
cin>>t>>m;
while(t)
{
a[n++] = t%10;
t/= 10;
}
bool vis[15];
f[0][0] = 1;
int li = 1<<n;
for(int i = 0;i< li;i++)
{
for(int j = 0;j< m;j++)
{
if(f[i][j] == 0) continue;
mem(vis,0);
for(int k = 0;k< n;k++)
{
if((i&(1<<k))||vis[a[k]]) continue;
if(i == 0&&a[k] == 0) continue;
vis[a[k]] = 1;
f[i|(1<<k)][(j*10+a[k])%m]+= f[i][j];
}
}
}
cout<<f[li-1][0]<<endl;
return 0;
}
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 2e5+5;
const double eps = 1e-12;
const int inf = 0x3f3f3f3f;
map<int,int>::iterator it;
int n;
int a[25],m;
int num[15];
int li;
ll f[300000][101];
ll dfs(int sta,int mo)
{
if(sta == (li-1))
return mo == 0;
if(f[sta][mo]!= -1) return f[sta][mo];
int vis[11]; mem(vis,0);
ll ans = 0;
for(int i = 0;i< n;i++)
{
if((sta&(1<<i)) == 0&&!vis[a[i]])
{
vis[a[i]] = 1;
if(sta == 0&&a[i] == 0) continue;
ans+= dfs(sta|(1<<i),(mo*10+a[i])%m);
}
}
return f[sta][mo] = ans;
}
int main()
{
mem(f,-1);
ll t;
cin>>t>>m;
while(t)
{
a[n++] = t%10;
num[t%10]++;
t/= 10;
}
li = 1<<n;
cout<<dfs(0,0)<<endl;
return 0;
}