1072: [SCOI2007]排列perm

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1479  Solved: 928

[

id=1072" style="color:blue; text-decoration:none">Submit][Status][

id=1072" style="color:blue; text-decoration:none">Discuss]

Description

给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(能够有前导0)。比如123434有90种排列能被2整除。当中末位为2的有30种,末位为4的有60种。

Input

输入第一行是一个整数T,表示測试数据的个数,下面每行一组s和d,中间用空格隔开。s保证仅仅包括数字0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Output

每一个数据仅一行。表示能被d整除的排列的个数。

Sample Input

7

000 1

001 1

1234567890 1

123434 2

1234 7

12345 17

12345678 29

Sample Output

1

3

3628800

90

3

6

1398

HINT

在前三个样例中。排列分别有1, 3, 3628800种,它们都是1的倍数。

【限制】



100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15

Source

状压DP题目

f[i][j]表示状态为i,余数为j的方案数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
using namespace std;
int t,d,n,ans;
int f[1050][1005],cnt[20],fac[20],g[1050],p[20];
char s[20];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline int calc(int x)
{
int ret=0;
while (x){ret+=x&1;x>>=1;}
return ret;
}
inline void dp(int x)
{
F(i,0,n-1) if ((1<<i)&x)
{
int tmp=p[g[x]-1]%d*(s[i]-'0')%d;
F(j,0,d-1) f[x][(j+tmp)%d]+=f[x^(1<<i)][j];
}
}
int main()
{
fac[0]=1;
F(i,1,10) fac[i]=fac[i-1]*i;
p[0]=1;
F(i,1,10) p[i]=p[i-1]*10;
F(i,0,1023) g[i]=calc(i);
t=read();
while (t--)
{
memset(f,0,sizeof(f));
scanf("%s%d",s,&d);
n=strlen(s);
f[0][0]=1;
F(i,1,(1<<n)-1) dp(i);
ans=f[(1<<n)-1][0];
memset(cnt,0,sizeof(cnt));
F(i,0,n-1) cnt[s[i]-'0']++;
F(i,0,9) ans/=fac[cnt[i]];
printf("%d\n",ans);
}
}

bzoj1072【SCOI2007】排列perm的更多相关文章

  1. [BZOJ1072][SCOI2007]排列perm 状压dp

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2488  Solved: 1546[Submit][St ...

  2. 【枚举】bzoj1072 [SCOI2007]排列perm

    暴力,next_permutation函数用于枚举出下一个排列.sscanf函数用于将字符串转化成数字. #include<cstdio> #include<cstring> ...

  3. [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  4. [bzoj1072] [SCOI2007]排列perm

    有一种暴力算法就是直接枚举. 正解就是状压dp 令f[i][j]:i:使用的数位的状态j:当前的模数 边界:f[0][0] = 1; f[i|1<<k][j*10+k % n] += f[ ...

  5. BZOJ 1072: [SCOI2007]排列perm 状态压缩DP

    1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...

  6. SCOI2007排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 805  Solved: 497[Submit][Stat ...

  7. BZOJ 1072 [SCOI2007]排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1268  Solved: 782[Submit][Sta ...

  8. [BZOJ1072][SCOI2007] 排列prem

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  9. 1072: [SCOI2007]排列perm - BZOJ

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种.Input ...

  10. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

随机推荐

  1. Myeclipse2014安装&破解激活

    市场上很多JavaWeb的IDE比如Idea(听说用好开发效率会很高),eclipse(插件丰富还免费),但是对于初学者还是为了提高学习的效率(Myeclipse创建web项目的时候可以自动生成一些配 ...

  2. SpringMVC中Controller类的方法返回String不跳转,而是将字符串显示到页面

    问题描述: 在spring中,控制层的注解一般都是使用@Controller,如果哪个请求参数需要返回数据的话,我们可以在该方法上配合@ResponseBody注解使用,这也是比较常见的方式了. 今天 ...

  3. Socket编程的简单实现

    关于socket编程的简单实现,主要分成客户端.服务端两个部分.实现如下: 1.服务端代码如下,注意:server端要优先于client端启动 2.client端代码,以及启动后客户端和服务端之间的简 ...

  4. Farseer.net轻量级开源框架 入门篇:查询数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...

  5. android studio使用中碰到Failure [INSTALL_FAILED_OLDER_SDK] 问题

    第一次使用Android studio开发.直接新建一个默认项目运行出现:Failure [INSTALL_FAILED_OLDER_SDK] , 网上很多人说修改build.gradle中的mins ...

  6. Commons_IO_FileUtils的使用

    commos_io.jar包下载地址:http://commons.apache.org/proper/commons-io/download_io.cgi 官方文档地址:http://commons ...

  7. 14Oracle Database 高级事务,游标

    Oracle Database 高级事务,游标 隔离级别 脏读 不可重复读 虚读 读未提交 Read uncommitted 可以 可以 可以 读已提交 Read committed 不可以 可以 可 ...

  8. 08Oracle Database 完整性约束

    Oracle Database 完整性约束 非空约束 创建表时 Create table table_name( Column_name datatype NOT NULL,… ); 修改表时 Alt ...

  9. java protostuff 序列化反序列化工具

    protostuff是由谷歌开发的一个非常优秀的序列化反序列化工具 maven导入包: <dependency> <groupId>io.protostuff</grou ...

  10. c# Dictionary 扩展方法

    主要用于接口请求,数据转换 #region Dictionary 扩展方法 public static string getString(this Dictionary<string, stri ...