luogu_P4163 [SCOI2007]排列

---恢复内容开始---

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\n",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\n",ans);
}
}

}

int main() {

//freopen("x.txt","r",stdin);
all::solve();

}

posted @ 2019-10-24 14:16  pai_hoo  阅读(99)  评论(0编辑  收藏  举报