Link:

BZOJ 2425 传送门

Solution:

其实就是利用数位$dp$的思想来暴力计数的一道题目

如果答案有$dgt$位,可以类似 [BZOJ 1833] 先计算出1至$dgt-1$位的情况再根据上界逐位枚举

不过实际上可以通过添补前导0的方式将所有情况都补为$dgt$位统一计算

其中组合数部分的计算可以使用阶乘的方式:$\frac{(\sum_{i=0}^9 cnt_i)!}{cnt_0!+cnt_1!...+cnt_9!}$

但为了防止阶乘爆$long long$,要通过拆分后统计每一个质因数个数的方式来求解

更简便的方式是直接使用组合数:$\sum_{i=0}^9 C[tot-sum(i-1)][cnt_i]$

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll res=;
char s[];
int C[][],cnt[],len;
int idx(char ch){return ch-'';}
int main()
{
C[][]=;
for(int i=;i<=;i++)
{
C[i][]=;
for(int j=;j<=;j++)
C[i][j]=C[i-][j-]+C[i-][j];
} scanf("%s",s+);len=strlen(s+);
for(int i=;i<=len;i++) cnt[idx(s[i])]++;
for(int i=;i<=len;i++)
{
for(int j=;j<idx(s[i]);j++)
if(cnt[j])
{
int t=len-i;ll pro=;
cnt[j]--;
for(int k=;k<=;k++)
pro*=C[t][cnt[k]],t-=cnt[k];
res+=pro;cnt[j]++;
}
cnt[idx(s[i])]--;
}
printf("%lld",res);
return ;
}

Review:

1、两阶乘相除位数不够时可以通过逐个质因数统计次幂的方式来解决

ll cal(ll x,ll t){
ll res=;
while (x/t) res+=(x/=t);
return res;
}
ll solve()
{
ll res=;
for (int i=;i<=tot && pri[i]<=mx;i++)
{
ll pw=cal(mx,pri[i]);
for (int j=;j<;j++) pw-=cal(cnt[j],pri[i]);
res=res*qpow(pri[i],pw);
}
return res;
}

2、通过添加前导零将所有答案化成同一位数,方便统计

[BZOJ 2425] 计数的更多相关文章

  1. bzoj 2425 [HAOI2010]计数 dp+组合计数

    [HAOI2010]计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 451  Solved: 289[Submit][Status][Discus ...

  2. BZOJ 2425 [HAOI2010]计数:数位dp + 组合数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 题意: 给你一个数字n,长度不超过50. 你可以将这个数字: (1)去掉若干个0 ( ...

  3. Week Two

    2018.12.3: 1.[BZOJ 4819] 2.[BZOJ 4827] 3.[P1919] 4.[FFT模板] 2018.12.4: 1.[NTT] 2.[MTT(CRT)] 3.[MTT(my ...

  4. 【BZOJ】【1211】【HNOI2004】树的计数

    Prufer序列+组合数学 嗯哼~给定每个点的度数!求树的种数!那么很自然的就想到是用prufer序列啦~(不知道prufer序列的……自己再找找资料吧,这里就不放了,可以去做一下BZOJ1005明明 ...

  5. 【BZOJ】【1016】【JSOI2008】最小生成树计数

    Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...

  6. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  7. BZOJ.4402.Claris的剑(组合 计数)

    BZOJ 因为是本质不同,所以考虑以最小字典序计数. 假设序列最大值为\(m\),那么序列有这两种情况: \(1\ (1\ 2\ 1\ 2...)\ 2\ (3\ 2\ 3\ 2...)\ 3\ (4 ...

  8. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  9. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

随机推荐

  1. B. Light It Up 思维题

    Recently, you bought a brand new smart lamp with programming features. At first, you set up a schedu ...

  2. 树形DP小结

    树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...

  3. 把java的class文件打成jar包的步骤

    现在我的文件夹的目录在: C:\Users\linsenq\Desktop\cglibjar 我要把位于这个目录下的所有文件夹以及这个文件夹下的.class文件打成jar包 第一步:用win+R 打开 ...

  4. lvm扩容

    111 mkfs -t xfs /dev/sda3 112 pvcreate /dev/sda3 113 vgs 114 vgextend cl /dev/sda3 115 lvscan 116 vg ...

  5. CSS垂直居中小结

    1.设置子元素: { ... position :absolute; margin:auto; top:; right:; bottom:; left:; } 2.设置子元素:(height必须是固定 ...

  6. React 获取 url 参数 —— this.props.match

    在 react 组件的  componentDidMount 方法中打印一下 this.props,在浏览器控制台中查看输出如下: 其中页面的 url 信息全都包含在 match 字段中,以地址 lo ...

  7. 关于ora-12154:TNS:could not resolve the connect identifier specified

    一:前言 刚刚出来实习,在公司配的电脑里面装的oracle和PL SQL时一次性就搞定,但是在自己的电脑上装了就出现这个问题,刚刚在网上看了下,所以自己就写份记载吧! 二: 在打开PLSQL Deve ...

  8. bzoj2161: 布娃娃

    Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是分不开的.雨荨的妈妈也为有这么一个懂事的 ...

  9. Django-csrf跨站请求伪造

    方式一: 下列代码插入ajax提交之$.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 注意:该代码中包含模板渲染语 ...

  10. System and method for parallel execution of memory transactions using multiple memory models, including SSO, TSO, PSO and RMO

    A data processor supports the use of multiple memory models by computer programs. At a device extern ...