Codeforces 401D. Roman and Numbers

http://codeforces.com/problemset/problem/401/D

数位DP。。。

记得结果要除以0。。9出现次数的阶乘。。。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#include<cmath>
#define ll long long
#define print(k) cout<<#k"="<<k<<endl;
ll dp[1<<18][111];
ll n;   int mod;
int bit[33];
int len;
int cnt[33];
void get(ll n)
{
    len=0;
    memset(bit,0,sizeof bit);
    memset(cnt,0,sizeof cnt);
    while(n)
    {
        tar[n%10]++;
        cnt[n%10]++;
        bit[len++]=n%10;
        n/=10;
    }
}
int main()
{
    while(cin>>n>>mod)
    {
        memset(dp,0,sizeof dp);
        get(n);
        dp[0][0]=1;
        for(int i=0;i<len;i++)
            if(bit[i]>0) dp[1<<i][bit[i]%mod]+=dp[0][0];
        for(int i=1;i<(1<<len);i++)
            for(int j=0;j<mod;j++)
        {
            if(!dp[i][j]) continue;
            for(int k=0;k<len;k++)
                if(!(i&(1<<k)))
                dp[i|(1<<k)][(j*10+bit[k])%mod]+=dp[i][j];
        }
        ll ans=dp[(1<<len)-1][0]; //    cout<<ans<<endl;
        for(int i=0;i<=9;i++)
            for(int j=1;j<=cnt[i];j++)
            ans/=j;
        cout<<ans<<endl;
    }
}


你可能感兴趣的:(Codeforces 401D. Roman and Numbers)