BZOJ 1072: [SCOI2007]排列perm

来源:互联网 发布:python txt按比例拆分 编辑:程序博客网 时间:2024/05/16 04:53

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1072



分析:直接暴力吧,没什么好说的


代码:

#include <iostream>#include <cstdio>#include <cstring>#include <stack>#include <string.h>#include <queue>#include <vector>#include <algorithm>#include <cassert>#include <set>#include <map>#include <cmath>#include <ctime>using namespace std;#define rep(i,a,b) for(int i=(a);i<(b);++i)#define rrep(i,a,b) for(int i=(a);i>=(b);--i)#define clr(a,x) memset(a,(x),sizeof(a))#define eps 1e-8#define LL long long#define mp make_pairconst int maxn=10+5;const int mod=1e9+7;int L[maxn],R[maxn],num[maxn];void remove(int x) { L[R[x]]=L[x]; R[L[x]]=R[x]; }void resume(int x) { L[R[x]]=R[L[x]]=x; }int ans;char s[maxn];int d;void dfs(int r){    if(R[0]==0) { if(r==0) ++ans; return; }    for(int i=R[0];i!=0;i=R[i]) {        --num[i];        if(num[i]==0) remove(i);        dfs((r*10+i-1)%d);        ++num[i];        if(num[i]==1) resume(i);    }}int main(){//    freopen("in.txt","r",stdin);    int T; cin>>T;    while(T--) {        scanf("%s%d",s,&d);        clr(num,0);        rep(i,0,12) L[i]=i-1,R[i]=i+1;        L[0]=11; R[11]=0;        for(int i=0;s[i];++i) {            ++num[s[i]-'0'+1];        }        rep(i,1,12)        if(num[i]==0) remove(i);        ans=0;        dfs(0);        printf("%d\n",ans);    }}


0 0
原创粉丝点击