bzoj 1072: [SCOI2007]排列perm 状压dp
2024-08-22 21:50:44
code:
#include <bits/stdc++.h>
#define N 1005
using namespace std;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"W",stdout);
}
char str[N];
int num[N],f[N<<1][N],poww[N],tax[11],fac[N],vis[11];
void solve()
{
memset(f,0,sizeof(f));
memset(tax,0,sizeof(tax));
memset(vis,0,sizeof(vis));
int mod,i,j,n,k;
scanf("%s%d",str,&mod);
n=strlen(str);
fac[0]=poww[0]=1;
for(i=1;i<=10;++i) fac[i]=fac[i-1]*i;
for(i=1;i<=n;++i) poww[i]=poww[i-1]*10%mod;
for(i=0;i<n;++i) num[i]=str[i]-'0', ++tax[num[i]];
f[0][0]=1;
for(i=0;i<(1<<n);++i)
{
for(j=0;j<mod;++j)
{
int sz=0;
for(k=0;k<n;++k) if(i&(1<<k)) ++sz;
for(k=0;k<n;++k)
{
if(i&(1<<k)) continue;
else
{
int nx=i|(1<<k);
int cur=num[k];
f[nx][(j+cur*poww[sz]%mod)%mod]+=f[i][j];
}
}
}
}
int ans=f[(1<<n)-1][0];
for(i=0;i<n;++i) if(!vis[num[i]]) vis[num[i]]=1, ans/=fac[tax[num[i]]];
printf("%d\n",ans);
}
int main()
{
// setIO("input");
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
最新文章
- listview侧滑删除
- sublime text 2 快捷键
- Vijos1881闪烁的繁星 [线段树]
- Eclipse启动时布局不合理调整
- Java多线程基础知识(二)
- error MSB6006: &ldquo;cmd.exe&rdquo;已退出,代码为 3。
- CE搜索内存数据的原理
- poj1308 并查集
- bat file handling, main: echo type *.txt >;>; />;
- Ubuntu 环境变量及 ADB 配置
- 在centos使用rpm包的方式安装mysql,以及更改root密码
- Python实现kNN(k邻近算法)
- cellspacing cellpadding
- install font
- 【推荐】开源项目minapp-重新定义微信小程序的开发
- windowsXP下搭建JAVA环境教程
- JavaScript(第十九天)【DOM进阶】
- 扫描工具nmap介绍
- Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
- 团队作业——UML设计
热门文章
- Android--创建快捷方式
- TypeScript之泛型
- Jupyter Notebook的配置(密码端口+远程登陆+nbextension)
- Java 二叉搜索树 实现和学习
- JML规格编程系列——OO Unit3分析和总结
- Synchronized 和 Lock 的主要区别(转)
- Node笔记(新手入门必看)
- Jest did not exit one second after the test run has completed.
- 设置 SQL*Plus 的运行环境
- JavaScript 继承 封装 多态实现及原理详解