题目链接:点击查看

题目大意:给出一个正整数num,现在将其进行除以2、除以3、除以4....的操作,直到num变为0为止,期间记录每一次运算的余数,将其排序后得到一个集合,现在问有多少不同的数字经相同处理后的集合与num的集合相等

题目分析:如果想让余数组成的集合相等,需要排列组合计算个数,比如正常的全排列,若是有n个数,那么对于第一个位置,可以有n种选择,对于第2个数,可以有n-1种选择,依次类推得到的是全排列的公式n!,但是考虑到这个题目对于每个位置可供选择的余数都是有限制的,所以不能贸然直接用全排列去计算,不过我们可以借助全排列的思想去进行实现,因为越往后的限制越小,所以我们可以从第一位进行选择,因为对于第i位的余数,可以选择的范围是0~i(第i位的余数是被除数除以(i+1)得到的),所以先将前面的方案数确定,利用全排列的思想依次确定后续的方案数,最后记得去重,因为有重复元素,每种相同的元素个数为cnt,则会重复计算cnt!次,因为这cnt个相同元素内部全排列后的结果都是一样的,最后这个题目还有一个细节,就是第一位上肯定不能为0,因为0不可能作为被除数出现在这个题目中,最后一次的除法运算肯定是商为0,余数为其本身才能达到终止循环,这样一来答案需要减去最后一位为0的方案数,最后ans-1就是答案了,减去当前这个数的本身

2020.9.3更新:

昨天训练的时候碰到的原题,最后那个细节,也就是最后一个位置忘记不能是零了,怎么都跑不出样例,就非常自闭了,还有去年写的代码,也是仿照别人的代码写的,就是非常的丑,关于阶乘和统计多少个小于当前位置的数,用前缀和不香嘛,后面附上重构后的代码

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;vector<int>v;void init(LL x)
{v.clear();for(int i=2;x;i++){v.push_back(x%i);x/=i;}sort(v.begin(),v.end());
}LL solve()
{LL ans=1;for(int i=0;i<v.size();i++){int cnt=0;for(int j=0;j<v.size();j++){if(v[j]<i+2)cnt++;}ans*=cnt-i;}LL fac=1;for(int i=0;i<v.size()-1;i++){if(v[i]==v[i+1])ans/=++fac;elsefac=1;}return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){LL num;scanf("%lld",&num);init(num);LL ans=solve();if(v[0]==0){v.erase(v.begin());ans-=solve();}printf("%lld\n",ans-1);}return 0;
}

更新:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;const int M=20;vector<int>node;LL sum[M],fac[M],cnt[M];void init(LL n)
{node.clear();for(int i=2;n;i++){node.push_back(n%i);n/=i;}sort(node.begin(),node.end());
}LL solve()
{LL ans=1;memset(sum,0,sizeof(sum));memset(cnt,0,sizeof(cnt));for(int num:node){sum[num]++;cnt[num]++;}for(int i=1;i<M;i++)sum[i]+=sum[i-1];for(int i=1;i<=node.size();i++)ans*=(sum[i]-(i-1));for(int i=0;i<M;i++)ans/=fac[cnt[i]];return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);fac[0]=1;for(int i=1;i<M;i++)fac[i]=fac[i-1]*i;int w;cin>>w;while(w--){LL n;scanf("%lld",&n);init(n);LL ans=solve();if(node.front()==0){node.erase(node.begin());ans-=solve();}printf("%lld\n",ans-1);}return 0;
}

CodeForces - 1267K Key Storage(组合数学)相关推荐

  1. CodeForces - 1523E Crypto Lights(组合数学+推公式)

    题目链接:点击查看 题目大意:给出 nnn 个初始时熄灭的灯泡,每次操作会等概率打开一个灯泡,当每 kkk 个连续的灯泡中出现了大于一个亮着的灯泡时停止操作,问期望操作次数是多少 题目分析:组合数学题 ...

  2. CodeForces - 1288C Two Arrays(组合数学)

    题目链接:点击查看 题目大意:给出一个n和m,要求我们构造出两个数组a和b,满足以下要求: 两个数组的长度都为m 每个元素的取值都为1~n 对于每一个位置都有a[i]<=b[i] 数组a非降序 ...

  3. Codeforces 396A 数论,组合数学

    题意:给一个a数组,求b 数组的方案数,但是要求两者乘积相同. 分析: 不可能将它们乘起来,对于每个数质因数分解,得到每个质因子个数,遍历这些质因子,将某个质因子放到 对应的盒子里面,可以不放,方案数 ...

  4. CodeForces - 1420D Rescue Nibel!(组合数学+离散化)

    题目链接:点击查看 题目大意:给出 n 盏灯,每盏灯在 [ l , r ] 这段时间内会保持点亮的状态,问恰好有 k 盏灯同时点亮,有多少种组合方式 题目分析:因为每盏灯都有一个开始亮的时间和一个熄灭 ...

  5. CodeForces - 1366E Two Arrays(组合数学+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a ,再给出一个长度为 m 的序列 b ,题目保证序列 b 是严格递增的,我们需要将 a 分割成恰好 m 段,使得每一段的最小值恰好等于 b[ ...

  6. CodeForces - 1359E Modular Stability(组合数学)

    题目链接:点击查看 题目大意:给出一个 n 和 k ,要求构造一个长度为 k 的严格递增数组 a[ i ] ,且 1 <= a[ i ] <= n ,满足任意整数 x ,对下列的等式恒成立 ...

  7. codeforces 571A Lengthening Sticks 组合数学 插板法

    题意 给我们四个数,a,b,c,la,b,c,la,b,c,l问: a′=a+x1b′=b+x2c′=c+x3x1+x2+x3<=la'=a+x_1\quad b'=b+x_2\quad c'= ...

  8. mysql integrityerror_mysql插入数据报错IntegrityError: (1062, Duplicate entry 'xx' for key 'xxxxx')...

    1.问题描述 MySQL插入数据的时候报错,提示如下: IntegrityError: (1062, "Duplicate entry 'xx' for key 'xxxxx'") ...

  9. html5客户端本地存储之sessionStorage及storage事件

    首先您可以看一下<JavaScript本地存储实践(html5的localStorage和ie的userData)> sessionStorage和上文中提到的localStorage非常 ...

最新文章

  1. python学习--服务期间通讯和mysql数据库操作
  2. canvas js 绘图插件_[开盖即食]小程序图表插件eCharts实战
  3. .net IDE 界面编程AutoScale属性惹的大麻烦
  4. 传统POS/终端/银联POS简介
  5. JAVA绘制图片原理_java开发_图片截取工具实现原理
  6. web文件上传(一)--文件上传与json上传区别及方法
  7. 8. Sphinx 站内搜索
  8. 51单片机 驱动有源/无源蜂鸣器+Proteus仿真
  9. 设计原则-依赖倒置原则
  10. java设置excel自动调整行高_Java 设置Excel自适应行高、列宽
  11. CSS、Bulma介绍
  12. CAD2015 C#二次开发 字体变形
  13. VMWare虚拟机处理器数量与每个处理器内核数量概念,以及分配CPU资源详解
  14. 腾讯要放弃 TIM 了?
  15. php微信一次性订阅消息demo,微信一次性订阅消息公众号或网页接入文档说明
  16. 鸡和兔放在一起,一共有20个头和56只脚,问鸡和兔各几只?
  17. 关于'//![cdata['和 '//]]'解答
  18. 【git系列005】git分支学习
  19. 遥感图像辐射增强ERDAS实现
  20. airpods pro是按压还是触摸_苹果三代耳机是触摸还是按键

热门文章

  1. Canal数据同步策略
  2. 初识ES-安装kibana
  3. 通过Nginx简单安装
  4. condition.await
  5. MyBatis 源码解读-typeHandlerElement()
  6. ES6新特性之class类的基本语法
  7. SpringBoot_web开发-webjars静态资源映射规则
  8. SpringBoot 路径处理
  9. Asp.NetCore-部署到IIS
  10. 熬过了互联网“寒冬”,接下来的金三银四你该怎么面试进BAT?