原题题意也就是给的数的全排列小于原数的个数。

我们可以很容易的想到重复元素的排列个数的公式。

但是我们发现阶乘的话很快就会爆long long啊(如果您想写高精请便)

之后我就尝试质因数分解。。。。但是遗憾的是太蒻了,没有成功,还是爆了。20分惨惨。最后也没有找出来哪里错了。

最后蒟蒻只好参考题解了。。。。。

之后我们再一考虑,会发现其实我们不需要重复元素排列个数的公式,我们只需要按照组合数的思想做即可。

假设我们现在有m个位置可以摆放,我们先放0,个数就是\(C_m^{cnt[0]}\),之后就只剩\(m-cnt[0]\)个位置了,那么\(ans+=C_{m-cnt[0]}^{cnt[1]}\)。。以此类推。。。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long CC[1001][1001];
long long C(long long n,long long m){
if(CC[n][m]) return CC[n][m];
if(m==1) return n;
if(m==0||m==n) return 1;
if(m>n) return 0;
CC[n][m]=C(n-1,m)+C(n-1,m-1);
return CC[n][m];
}
int a[10],v[100];
long long ans;
int n;
string c;
long long solve(){
long long ans=1;
int m=n;
for(int i=0;i<=9;i++)
if(a[i])
ans*=C(m,a[i]),m-=a[i];
return ans;
}
int main()
{
cin>>c;
for(int i=0;i<c.length();i++)
v[++n]=c[i]-'0',a[v[n]]++;
int nn=n;
for(int i=1;i<=nn;i++)
{
n--;
for(int j=0;j<v[i];j++)
if(a[j])
a[j]--,ans+=solve(),a[j]++;
a[v[i]]--;
}
printf("%lld",ans);
}

最后蒟蒻在这里贴上自己的20分代码。。求dalao找错。。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
long long ans;
vector<int>v;
string n;
int dig[60],sum[10]; inline long long solve(int cnt)
{
long long cur_ans=1;
int a[60];
memset(a,0,sizeof(a));
for(int i=1;i<=cnt;i++)
{
int now=i;
for(int j=2;j<=now;j++)
while(now%j==0)
now/=j,a[j]++;//printf("a[%d]=%d\n",j,a[j]);
}
for(int i=0;i<=9;i++)
{
if(sum[i]==0) continue;
int now=sum[i];
for(int j=2;j<=now;j++)
while(now%j==0)
now/=j,a[j]--;//printf("a[%d]=%d\n",j,a[j]);
}
for(int i=1;i<=50;i++)
if(a[i]!=0)
cur_ans*=(long long)pow(i,a[i]);
return cur_ans;
} int main()
{
cin>>n;
for(int i=0;i<n.length();i++)
v.push_back(n[i]-'0');
int cnt=v.size();
for(int i=0;i<v.size();i++)dig[i+1]=v[i];
//for(int i=1;i<=cnt;i++) cout<<dig[i];
//cout<<endl;
for(int i=1;i<=cnt;i++)
{
int done[10];
memset(done,0,sizeof(done));
for(int j=i+1;j<=cnt;j++)
{
memset(sum,0,sizeof(sum));
if(done[dig[j]]==0&&dig[j]<dig[i])
{
done[dig[j]]=1;
for(int k=i+1;k<=cnt;k++)
sum[dig[k]]++;
sum[dig[i]]++;
sum[dig[j]]--;
ans+=(long long)solve(cnt-i);
//printf("dig[%d]=%d dig[%d]=%d ans=%lld\n",i,dig[i],j,dig[j],ans);
}
}
}
printf("%lld\n",ans);
return 0;
}

[HAOI2010]计数(组合数学)(数位DP)的更多相关文章

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

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

  2. [luoguP2518][HAOI2010]计数(数位DP)

    传送门 重新学习数位DP.. 有一个思路,枚举全排列,然后看看比当前数小的有多少个 当然肯定是不行的啦 但是我们可以用排列组合的知识求出全排列的个数 考虑数位dp 套用数位dp的方法,枚举每一位,然后 ...

  3. P2518 [HAOI2010]计数 类似数位dp

    题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  4. BZOJ2425 [HAOI2010]计数 【数位dp】

    题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  5. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  6. BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp ...

  7. 【洛谷】2602: [ZJOI2010]数字计数【数位DP】

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...

  8. BZOJ1833 ZJOI2010 count 数字计数 【数位DP】

    BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...

  9. LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925

    题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的 ...

  10. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

随机推荐

  1. Kafka Zookeeper 基本命令示例

    Kafka 新建Topic bin/kafka-topics. --replication-factor --partitions --topic my-topic 查看已存在Topic列表 bin/ ...

  2. python 中类的初始化过程

    首先元类中的__new__被调用 所有使用该元类的类都会调用一次,不管其有没有初始化,所以元类__new__的作用是修改/验证类的定义 返回的是一个元类的实例,即一个类的定义 元类的__init__由 ...

  3. rocketmq消费负载均衡--push消费为例

    本文介绍了DefaultMQPushConsumerImpl消费者,客户端负载均衡相关知识点.本文从DefaultMQPushConsumerImpl启动过程到实现负载均衡,从源代码一步一步分析,共分 ...

  4. linux: sort排序数据 grep搜索数据

    sort 1.sort filename 输出排序后的结果,默认按字符大小排序 2.-n 按数字排序(如果内容是数字的话) 3.-M 按月份排序(如果是三字符简写月份的话) 下面这个例子非常实用: g ...

  5. 【HDU4405】Aeroplane_chess

    题意 飞行棋.有n+1格,开始时在0号格子,每一步都要扔一个dice(六个面,概率相同)哪一面朝上他就会向前走x+i步.当x+i大于等于N的时候,游戏结束.另外,地图上有m条航线.第i条航线可以直接从 ...

  6. 【bzoj3239】Discrete Logging

    [吐槽] 这题和[bzoj]2480一毛一样. 就是输入顺序和输出变了一下. 传送门:http://www.cnblogs.com/chty/p/6043707.html

  7. vagrant 安装与配置

    1.下载vagrant的安装包 http://downloads.vagrantup.com/ 2.解压安装 3.安装box环境   4.安装成功显示 5.提示要安装virbox

  8. Python tkinter 副窗体置顶和取消置顶

    root = Tk() #置顶root.wm_attributes('-topmost',1) #取消置顶 root.wm_attributes('-topmost',0)

  9. Qt5.7学习

    一 Qt简介(Build your world with Qt) 二 Qt5.7.0的安装 三 Qt系统构造库及常用类 四 信号(signal)与槽(slot)通信机制 五 QtDesigner开发工 ...

  10. [模板]KMP字符串匹配

    洛谷P3375 注意:两次过程大致相同,故要熟读熟记,切勿搞混 可以看看其他的教程:http://www.cnblogs.com/c-cloud/p/3224788.html 本来就不太熟,若是在记不 ...