记录编号 406912 评测结果 AAAAA
题目名称 [SCOI 2007]排列 最终得分 100
用户昵称 GravatarGilgamesh 是否通过 通过
代码语言 C++ 运行时间 0.173 s
提交时间 2017-05-20 09:54:02 内存使用 15.55 MiB
显示代码纯文本
#include<cstdio>
#include<string>
#include<cstring>
//#include<iostream>
#include<algorithm>
using namespace std;
inline int read()
{
   int s=0;
   int f=1;
   char ch=getchar();
   while(ch<'0'||ch>'9')
    {
       if(ch=='-')
        f=-1;
       ch=getchar();                    
    }       
   while(ch>='0'&&ch<='9')
    {
       s=s*10+ch-'0';
       ch=getchar();                      
    }
   return s*f;
}
int tot[110];
int num[110];
int cnt[110];
int dp[2000][2000];
inline void init()
{
     memset(num,0,sizeof(num));
     memset(dp,0,sizeof(dp));
     memset(cnt,0,sizeof(cnt));
     memset(tot,0,sizeof(tot));
     dp[0][0]=1;
     for(int i=0;i<=10;i++)
      cnt[i]=1;      
}
inline int work()
{
       freopen("wulipailie.in","r",stdin);
       freopen("wulipailie.out","w",stdout);
       int T=read();
       while(T--)
        {
           init();
           char s[20]; 
           scanf("%s",s);
           int d=read();
           int n=strlen(s);
//for(int i=0;i<n;i++)
//cout<<s[i];while(1);
//cout<<n;while(1);
//for(int i=1;i<=n;i++)
             
//for(int i=1;i<=n;i++)
// cout<<num[i];
//memset(cnt,1,sizeof(cnt));
//cout<<cnt[1];while(1);
           for(int i=1;i<=n;i++)
            {
               num[i]=s[i-1]-'0';
               tot[num[i]]++;
               cnt[num[i]]*=tot[num[i]];
            } 
//for(int i=1;i<=n;i++)
// cout<<num[i];
//while(1);
           for(int i=0;i<(1<<n)-1;i++)
		    for(int j=0;j<d;j++)
			 if(dp[i][j])
              for(int k=1;k<=n;k++)
               if(((1<<(k-1))&i)==0)
			    dp[i|(1<<(k-1))][(num[k]+j*10)%d]+=dp[i][j];
/*
for(int i=0;i<=(1<<n)-1;i++)	
for(int j=0;j<d;j++)
if(dp[i][j])
for(int k=1;k<=n;k++)
if(((1<<(j-1))&i)==0)
 dp[i|(1<<(k-1))][(num[k]+j*10)%d]+=dp[i][j];
*/
           for(int i=0;i<=9;i++)
            dp[(1<<n)-1][0]/=cnt[i]; 
//printf("ANS:::::");
           printf("%d\n",dp[(1<<n)-1][0]);
//for(int i=1;i<=n;i++)
//cout<<cnt[i]<<endl;
//while(1);
        }
       //while(1);
}
int QAQ=work();
int main(void){;}
/*
7
000
1
001
1
1234567890
1
123434
2
1234
7
12345
17
12345678
29
*/

/*ans
1
3
3628800
90
3
6
1398
*/