NC20254. [SCOI2007]排列PERM
描述
输入描述
输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开。
s保证只包含数字0, 1 , 2, 3, 4, 5, 6, 7, 8, 9.
输出描述
每个数据仅一行,表示能被d整除的排列的个数。
示例1
输入:
7 000 1 001 1 1234567890 1 123434 2 1234 7 12345 17 12345678 29
输出:
1 3 3628800 90 3 6 1398
C++11(clang++ 3.9) 解法, 执行用时: 124ms, 内存消耗: 4836K, 提交时间: 2019-03-16 12:06:57
#include<cstdio> #include<cstring> #include<cstdlib> int t,p; char s[20]; int a[20],num[20]; int f[1050][1050]; int main() { scanf("%d",&t); while(t--) { memset(num,0,sizeof(num)); memset(f,0,sizeof(f)); scanf("%s%d",s,&p); int len=strlen(s); for(int i=0;i<len;i++) a[i]=s[i]-'0',num[s[i]-'0']++; f[0][0]=1; for(int i=0;i<(1<<len);i++) for(int j=0;j<len;j++) { if(!(i&(1<<j))) { for(int u=0;u<p;u++) f[i^(1<<j)][(u*10+a[j])%p]+=f[i][u]; } } long long ans=f[(1<<len)-1][0]; for(int i=0;i<=9;i++) for(int j=2;j<=num[i];j++) ans/=j; printf("%lld\n",ans); } }