又颓废了一个下午,最近撸mc撸到丧失意识了,玩的有点恶心,于是找水题做,瞧不起颓废的自己啊。

another水题。

这题题意很明显啦,就是找数字排列后组成的数去mod d=0后有多少种。

普通的搜索的话,是会tle的(应该是o(n!)没错?)。注意到长度n还是比较小的,于是想到状压dp。

状态就是每个数取和不取组成的结果(就是00110表示第3,4个数取了啦,学过状压都知道)。

然后转移就是f[i,j,k]表示现在取到第i个数状态为i余数为j有多少种情况,

那么f[i,j,(k*10+a[i])mod d]=Σf[i-1,j',k](也就是同余的东西啦,在123后加一个数字4,那么1234 mod d=((123 mod d *10)+4 )mod d )。k的范围就是0-(d-1)啦。其实就是一个01背包,然后i是可以去掉的。

最后就是处理重复的问题了,之前好像也做过类似的,不过反过来的……重复的话可以这么想,比如有4个2重复,那么对于第4个2来说,加上它后重复的情况就是之前的情况*4,对于第三个2来说,加上它后重复的情况就是之前的情况*3,对于第二个2就是之前的情况*2(其实就是个排列组合……四个2有序号要比没有序号多A(4,4)=4!)。


var
b:array[..,..]of longint;
c,a:array[..]of longint;
f:array[..,..]of longint;
i,j,k,l,n,m,t,tot,top:longint; procedure into;
var
i,j,k,len:longint;
s:string;
begin
readln(s);
len:=length(s);
i:=pos(' ',s);
val(copy(s,i+,len-i),tot);
delete(s,i,len-i+);
n:=length(s);
fillchar(c,sizeof(c),);
for i:= to n do begin
a[i]:=ord(s[i])-ord('');
inc(c[a[i]]);
end;
top:=<<n-;
fillchar(b,sizeof(b),);
for i:= to top do begin
j:=i;
k:=;
while j<> do begin
inc(k);
dec(j,j and (-j));
end;
j:=k;
inc(b[j,]);
b[j,b[j,]]:=i;
end;
end; procedure work;
var
i,j,k,l,m,ans:longint;
begin
fillchar(f,sizeof(f),);
for i:= to n do
f[<<(i-),a[i] mod tot]:=;
for i:= to n do
for j:= to b[i,] do begin
k:=b[i,j];
for l:= to n do
if k and (<<(l-)) <> then
for m:= to tot- do
inc(f[k,(*m+a[l]) mod tot],f[k-<<(l-),m]);
end;
ans:=f[top,];
for i:= to do
if c[i]> then
for j:= to c[i] do ans:=ans div j;
writeln(ans);
end; begin
readln(t);
while t> do begin
dec(t);
into;
work;
end;
end.

【以前的空间】bzoj 1072 [SCOI2007]排列perm的更多相关文章

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

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

  2. BZOJ 1072 [SCOI2007]排列perm

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

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

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

  4. BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]

    题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0) 100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15 看到整 ...

  5. BZOJ 1072 [SCOI2007]排列perm ——状压DP

    [题目分析] 没什么好说的,水题. 代码比较丑,结果需要开long long 时间爆炸 [代码] #include <cstdio> #include <cstring> #i ...

  6. bzoj 1072: [SCOI2007]排列perm【状压dp】

    先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 #include<iost ...

  7. bzoj 1072: [SCOI2007]排列perm 状压dp

    code: #include <bits/stdc++.h> #define N 1005 using namespace std; void setIO(string s) { stri ...

  8. 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1072 首先无限膜拜题解orz表示只会暴力orz 数据那么小我竟然想不到状压! orz 这种题可以取模 ...

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

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

随机推荐

  1. Docker介绍及安装

    Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  2. JAVA FILE.renameTo跨文件系统移动文件失败

    遇到了FILE.renameTo跨文件系统移动文件失败的问题,应使用FILES.move()接口或在同一文件系统移动文件. FILE.renameTo接口说明: public boolean rena ...

  3. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  4. Qt-QML-Popup,弹层界面编写

    随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样.最近项目的祝界面框架都基 ...

  5. 获取App的PackageName包名和LauncherActivity启动页

    第一种情况: 查看手机里面已经安装的App: 用数据线连接手机, 打开开发者模式, 并赋予相关权限: 1. 清除日志: adb logcat -c 2. 启动日志: adb logcat Activi ...

  6. 了解Python控制流语句——while 语句

    while 语句 Python 中 while 语句能够让你在条件为真的前提下重复执行某块语句. while 语句是 循环(Looping) 语句的一种.while 语句同样可以拥有 else 子句作 ...

  7. 【radio-group、radio】 单选项组件说明

    radio-group组件是包裹radio组件的容器 原型: <radio-group bindchange="[EventHandle]"> <radio .. ...

  8. 【WXS数据类型】Array

    属性: 名称 值类型 说明 [Array].constructor [String] 返回值为“Array”,表示类型的结构字符串 [Array].length [Number] 返回数组长度 方法: ...

  9. OpenMPI源码剖析2:ompi_mpi_errors_are_fatal_comm_handler函数

    上一篇文章说道,初始化失败会有一个函数调用: ompi_mpi_errors_are_fatal_comm_handler(NULL, NULL, message); 所以这里简单地进入了 ompi_ ...

  10. 深入理解eos账户体系 active和action

    在eos中,账户是一个非常重要的概念. 账户分为两部分组成 一种是active 一种是action. 智能合约本质上来讲就是一个action加上一个回馈脚本程序.任何智能合约都有这俩个部分组成. 那么 ...