[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=2425

[算法]

类似与数位动态规划的思想 , 用组合数学进行简单推导即可

时间复杂度 : O(L ^ 3)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 110
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; #define int ll int L , L0;
int tmp[N] , digit[N] , cnt[N];
char s[N]; template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline ll quickpow(ll a , int n)
{
ll b = a , res = ;
while (n > )
{
if (n & ) res *= b;
b = b * b;
n >>= ;
}
return res;
}
inline void add(int x , int val)
{
for (int i = ; i <= (int)sqrt(x); i++)
{
if (x % i == )
{
while (x % i == )
{
tmp[i] += val;
x /= i;
}
}
}
if (x > ) tmp[x] += val;
} signed main()
{ scanf("%s" , s + );
L = strlen(s + );
for (int i = ; i <= L; i++)
{
if (s[i] > '') ++L0;
++cnt[s[i] - ''];
digit[i] = s[i] - '';
}
ll ans = ;
for (int k = ; k < L;k++)
{
if (k < L0) continue;
memset(tmp , , sizeof(tmp));
for (int i = ; i <= L0; i++) add(i , );
for (int i = ; i <= ; i++)
{
for (int j = ; j <= cnt[i]; j++)
{
add(j , -);
}
}
for (int i = ; i <= k - ; i++) add(i , );
for (int i = ; i <= L0 - ; i++) add(i , -);
for (int i = ; i <= k - L0; i++) add(i , -);
ll cont = ;
for (int i = ; i <= ; i++) cont *= quickpow(i , tmp[i]);
ans += cont;
}
for (int i = ; i <= L; i++)
{
for (int j = ; j < digit[i]; j++)
{
if (i == && !j) continue;
if (!j || cnt[j] > )
{
--cnt[j];
int nowcnt = ;
for (int k = ; k <= ; k++) nowcnt += cnt[k];
if (nowcnt > L - i)
{
++cnt[j];
continue;
}
memset(tmp , , sizeof(tmp));
for (int k = ; k <= nowcnt; k++) add(k , );
for (int x = ; x <= ; x++)
{
for (int y = ; y <= cnt[x]; y++)
{
add(y , -);
}
}
for (int k = ; k <= L - i; k++) add(k , );
for (int k = ; k <= nowcnt; k++) add(k , -);
for (int k = ; k <= L - i - nowcnt; k++) add(k , -);
ll cont = ;
for (int k = ; k <= ; k++) cont *= quickpow(k , tmp[k]);
ans += cont;
++cnt[j];
}
}
--cnt[digit[i]];
}
printf("%lld\n" , ans); return ;
}

[HAOI 2010] 计数的更多相关文章

  1. [HAOI 2010]软件安装

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  2. [HAOI 2010]订货

    Description 题库链接 某公司估计市场在第 \(i\) 个月对某产品的需求量为 \(U_i\) ,已知在第 \(i\) 月该产品的订货单价为 \(d_i\) ,上个月月底未销完的单位产品要付 ...

  3. [ HAOI 2010 ] 最长公共子序列

    \(\\\) \(Description\) 求两个长度\(\le5000\)的大写字母串的\(LCS\)长度及个数,定义两\(LCS\)中某一字符在两序列出现位置有一处不同就视为不同. \(\\\) ...

  4. BZOJ 2427 /HAOI 2010 软件安装 tarjan缩点+树形DP

    终于是道中文题了.... 当时考试的时候就考的这道题.... 果断GG. 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点. 随后就进行一遍树形DP就好了.. x表示当前的节点.j表 ...

  5. BZOJ 2467: [中山市选2010]生成树 [组合计数]

    2467: [中山市选2010]生成树 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 638  Solved: 453[Submit][Status][ ...

  6. [ZJOI 2010]Perm 排列计数

    Description 题库链接 询问有多少个 \(1\sim N\) 的排列 \(P\) 满足" \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ...

  7. [ZJOI 2010]count 数字计数

    Description 题库链接 问你 \([l,r]\) 区间内所有整数中各个数码出现了多少次. \(1\leq a\leq b\leq 10^{12}\) Solution 数位 \(DP\) . ...

  8. 「ZJOI 2010」 排列计数

    题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ...

  9. [ZJOI 2010] 排列计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2111 [算法] 一种比较好的理解方式是将该序列看成是一棵堆式存储的二叉树 那么问题转 ...

随机推荐

  1. 10.【nuxt起步】-引用mintui

    这时候我们完成了list.vue,但是怎么返回index.vue,这时候需要这个头部返回 1.我们使用现成的minu-ui,eleme的开源移动端 ,参考 https://www.cnblogs.co ...

  2. 高仿QQ6.0側滑菜单之滑动优化(二)

    好了,昨天已经实现了高仿QQ6.0的側滑大致框架.如有兴趣.能够去看下仿QQ6.0側滑之ViewDragHelper的使用(一) 可是之前的实现.仅仅是简单的能够显示和隐藏左側的菜单,可是特别生硬,并 ...

  3. python(17)- 迭代器和生成器及应用

    什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象 ...

  4. gulp-gulpfile.js语法说明

    关于gulpfile文件: 直接上代码吧!! /*! * gulp * $ npm install gulp gulp-ruby-sass gulp-cached gulp-uglify gulp-r ...

  5. 详谈kubernetes更新-2

    系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...

  6. kubernetes对象之secrets

    系列目录 Secrets是Kubernetes中一种对象类型,用来保存密码.私钥.口令等敏感信息.与直接将敏感信息嵌入image.pod相比,Secrets更安全.更灵活,用户对敏感信息的控制力更强. ...

  7. C语言宏定义时#(井号)和##(双井号)作用

    #的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号. #define example(instr) prin ...

  8. python的id()函数的一个小方面(转载)

    >>> a = 2 >>> b = 2 >>> id(a) 21132060 >>> id(b) 21132060 >&g ...

  9. HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  10. 【BZOJ1844/2210】Pku1379 Run Away 模拟退火

    [BZOJ1844/2210]Pku1379 Run Away 题意:矩形区域中有一堆点,求矩形中一个位置使得它到所有点的距离的最小值最大. 题解:模拟退火的裸题,再调调调调调参就行了~ #inclu ...