看到题解里好像都是用$DP$解决的,本着禁止DP的原则,我来提供一发纯数学其实和DP本质相同的题解,前两天刚反演题,脑子炸了,本来说换换脑子,结果还是数学

首先受进制思想启发,我们不妨按位考虑,考虑这一位选一对排列编号造成的影响——即让整个数的编号向后推移了多少

容易想到,这一位选一,编号增加了之后几位满足条件任选的方案数,即第$i$位选一,$cnt$表示前几位选了几个一

$$id+=\sum_{j=0}^{min(i-1,L-cnt)}calc(i-1,j)$$

$clac(x,y)$表示前面$y$位,选$x$位为一的方案数,这个就是一个可重集排列问题,即

$$clac(x,y)=\frac{y!}{x!*(y-x)!}$$

因为$n!$太大会爆$long~long$,所以我们可以使用唯一素数分解定理把阶乘拆成质因子的乘积,然后再乘起来

上代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define int long long
  5. using namespace std;
  6. int pr[]={,,,,,,,,,};
  7. int n,k,rk,cnt,ans[],cp[];
  8. void add(int x,int c)
  9. {
  10. //唯一素数分解
  11. for(int i=;i<=x;i++)
  12. for(int tmp=i,j=;j<&&tmp>;j++)
  13. while(tmp%pr[j]==)
  14. tmp/=pr[j],cp[j]+=c;
  15. }
  16. int make(int x,int y)
  17. {
  18. //可重集排列
  19. int ret=;
  20. memset(cp,,sizeof(cp));
  21. add(x,),add(y,-),add(x-y,-);
  22. for(int i=;i<;i++)
  23. for(int j=;j<=cp[i];j++)
  24. ret*=pr[i];
  25. return ret;
  26. }
  27. signed main()
  28. {
  29. scanf("%lld%lld%lld",&n,&k,&rk);
  30. rk--; //因为有=0的情况,所以rk-1
  31. if(!rk)
  32. {
  33. for(int i=;i<=n;i++)
  34. printf("");
  35. printf("\n");
  36. return ;
  37. }
  38. for(int i=n;i;i--)
  39. {
  40. //按位考虑选或不选
  41. int sum=;
  42. for(int j=;j<=min(i-,k-cnt);j++)
  43. sum+=make(i-,max(j,i--j));
  44. if(rk>=sum)
  45. rk-=sum,ans[i]=,cnt++;
  46. }
  47. for(int i=n;i;i--)
  48. printf("%lld",ans[i]);
  49. printf("\n");
  50. return ;
  51. }

Luogu P2727 【01串 Stringsobits】的更多相关文章

  1. 洛谷P2727 01串 Stringsobits

    P2727 01串 Stringsobits 24通过 55提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 这题的思路是啥啊!!!跪求- 题目背景 考虑 ...

  2. 洛谷 题解 P2727 【01串 Stringsobits】

    本蒟蒻又双叒叕被爆踩辣! P2727 01串 Stringsobits 其实只要理解了就会觉得这是个傻逼题! 这题给的标签是 dp,搜索,数论 但是可以用二分的思路做! Solution: 从最高位开 ...

  3. USACO Section 3.2 01串 Stringsobits

    题目背景 考虑排好序的N(N<=31)位二进制数. 题目描述 他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数. 你的任务是输出第i(1< ...

  4. [USACO Section 3.2] 01串 Stringsobits (动态规划)

    题目链接 Solution 贼有意思的 DP, 也可以用组合数学做. \(f[i][j]\) 代表前 \(i\) 位,有 \(j\) 个 \(1\) 的方案数. 转移方程很简单 : \(f[i][j] ...

  5. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  6. JZOJ P1847:找01串

    传送门 DP预处理+贪心 首先设$f[i][j]$表示长度为$i$的01串中有不大于$j$个1,然后显然 $f[i][j]=\sum_{k=1} ^{j} C[i][k]$ $C[i][j]=C[i- ...

  7. C++实现01串排序

    题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...

  8. 01串(dp)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...

  9. 【巧妙】【3-21个人赛】Problem C 01串

    Problem C Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

随机推荐

  1. Windows出现“引用账户被锁定,且暂时无法登录”解决方法

    1. 问题描述如下: i. 远程桌面登录时,出现提示必须修改密码才能登录,是因为密码过期所导致的,如下图: ii. 当我们登录Windows控制台(基于OpenStack平台的虚拟机)进行修改密码时, ...

  2. Ubuntu 18.04通过命令禁用/开启触控板

    Ubuntu下经常遇到无法用快捷键关闭触控板的情况,博主的电脑安装Ubuntu18.04后便出现了该问题. 解决办法: 首先查看输入设备的id,命令行输入: xinput ,插鼠标与不插鼠标时,Tou ...

  3. openstack连接报错net_mlx5: cannot load glue library: libibverbs.so.1

    部署openstack controller节点,第二天登录主机提示错误信息 Connecting to 10.1.10.151:22...Connection established.To esca ...

  4. 07webpack--下载对应的css模块

    <!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...

  5. python hash 哈希值

    自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...

  6. 201871010107-公海瑜《面向对象程序设计(java)》第6-7周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第6-7周学习总结                项目                                内容 ...

  7. 201871010136-赵艳强《面向对象程序设计(Java)》第八周学习总结

    201871010136-赵艳强<面向对象程序设计(Java)>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  8. hive数据库从文件插入数据得到结果NULL?

    今天第一次接触hive这个东东,跟着教程走,当把本地文件的数据装载到新建的hive的表中时,得到的结果是NULL,如图: 也不知道为什么,初次接触,对它的这个构造还不是很熟悉,看一下建表语句: 解决: ...

  9. cnpm包管理

    C:\Users\Administrator>npm config set registry http://registry.npm.taobao.org vue 安装 npm install ...

  10. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...