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

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

但是我们发现阶乘的话很快就会爆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. CentOS6上安装Flash Player

    Linux CentOS6服务器中的某个需要远程操作的项目需要使用到Adobe Flash Player组件,直接通过YUM方式安装不了,于是通过强大的搜索,还是可以解决到安装方法的,通过重新加载安装 ...

  2. spring cloud zuul 配置(Robbin 和 熔断)

    #启动负载均衡的重试机制,默认falsespring.cloud.loadbalancer.retry.enabled=true#Hystrix是否启用超时时间hystrix.command.defa ...

  3. 常用sql语句备份

    1.查看数据库中所有的存储过程 use [DataBase_Name] go SELECT * FROM sys.all_objects WHERE ([type] = 'P' OR [type] = ...

  4. [iOS]隐藏导航栏把右滑退出操作保留

    项目因为用到上面导航栏样式多变,就隐藏了导航栏自己用View代替了,但手势却不见了,后来发现问题解决.操作如下: 千万不要取消 Shows Navigation Bar 这个选项否则手势会消失 应该是 ...

  5. MongoDB常用增删改查语句

    数据库database 创建及查看库 1.有则使用这个数据库,没有就创建 use DATABASE_NAME 2. 查看当前选择的数据库,默认是test db 3.查看数据库,默认有admin.loc ...

  6. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  7. Spark Streaming原理简析

    执行流程 数据的接收 StreamingContext实例化的时候,需要传入一个SparkContext,然后指定要连接的spark matser url,即连接一个spark engine,用于获得 ...

  8. 王子和公主 UVa10635

    [题目描述]:王子和公主 一个王子和公主在n*n的格子中行走,这些格子是有1....n^2的编号的.现在给定p+1个数,再给定q+1个数,公主和王子可以选择其中某些格子行走,求他们最多能走几个相同的格 ...

  9. nginx内置变量详解-乾颐堂

    nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量.其中,部分预定义的变量的值是可以改变的. $arg_PARAMETER 这个变量值为:GET请求中变量名PARAMETER参数 ...

  10. 实践作业4:Web测试实践(小组作业)每日任务记录3

    会议时间:2017年12月23日 会议地点:东九教学楼自习区 主  持  人:王晨懿 参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元 记  录  人:王晨懿 会议议题:小组作业第二阶段 下面是今天 ...