洛谷P1066:https://www.luogu.org/problemnew/show/P1066

思路

挺难的一道题 也很复杂

满足题目要求的种数是两类组合数之和

r的最多位数m为

  1. w/k(当w mod k=0 时)
  2. w/k+1(当 w mod k=1 时)

First:

位数为2~m的种数

即从2k-1中不重复地取i个的组合数(只取到2k-1是因为2k会进位)

即C(2k-1,2)+C(2k-1,3)+...+C(2k-1,m)

Second:

位数为m+1的种数

因为要每个数严格小于左边

所以枚举第一位的值i 再取其他的组合数C(2k-1-i,m)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int total[];//存高精ans
int k,w,n,m,c;
int gcd(int a,int b)
{
if(a%b==) return b;
else return gcd(b,a%b);
}
void C(int n,int m)
{
if(n<m) return;
int a[],b[],x,g;
for(int i=m;i>=;i--)
{
a[i]=n+i-m;//分子的因子n!/(n-m)!
b[i]=i;//分母的因子m!
}
for(int i=;i<=m;i++)//约分 去掉分母b[i]
{
if(b[i]==) continue;
for(int j=m;j>=;j--)//高精除法
{
x=gcd(b[i],a[j]);
b[i]/=x;
a[j]/=x;
if(b[i]==) break;
}
}
memset(b,,sizeof(b));
b[]=,b[]=;
for(int j=;j<=m;j++)//约分后的分子相乘
{
g=;
if(a[j]==) continue;
for(int i=;i<=b[];i++)
{
b[i]=b[i]*a[j]+g;//高精乘法
g=b[i]/;
b[i]%=;
if(i==b[]&&g!=) b[]++;//如果还要进位 说明长度要加1
}
}
total[]=max(total[],b[]);
for(int i=;i<=total[];i++)//高精加法
{
total[i]+=b[i];
total[i+]+=total[i]/;
total[i]%=;
}
if(total[total[]+]!=) total[]++;//如果还要进位 说明长度要加1
}
int main()
{
cin>>k>>w;
n=(<<k)-;//2^k-1
c=w%k;
m=w/k;//最高位数
for(int i=m;i>=;i--) C(n,i);//计算位数为2~len-1的组合数
c=(<<c)-;//最高位可取最大值
if(c>=&&n>m)//计算位数为len的组合数
for(int i=;i<=c;i++) C(n-i,m);//第一位取了i 后面只能取n-i 且要取m个
for(int j=total[];j>=;j--) cout<<total[j];//逆序输出ans
}

【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)的更多相关文章

  1. 【洛谷p1066】2^k进制数

    (不会敲键盘惹qwq) 2^k进制数[传送门] 算法标签: (又是一个提高+省选-的题) 如果我说我没听懂你信吗 代码qwq: #include<iostream> #include< ...

  2. 关于不同进制数之间转换的数学推导【Written By KillerLegend】

    关于不同进制数之间转换的数学推导 涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换 数的进制有多种,比如 ...

  3. [洛谷 P1013] NOIP1998 提高组 进制位

    问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  4. 洛谷P1066 2^k进制数(题解)(递推版)

    https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...

  5. 洛谷 P1066 2^k进制数

    P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...

  6. 洛谷P1066 2^k进制数

    P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...

  7. [NOIP2006] 提高组 洛谷P1066 2^k进制数

    题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...

  8. 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有 ...

  9. C#版 - Leetcode 504. 七进制数 - 题解

    C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...

随机推荐

  1. 网站加入QQ聊天链接

    有时候我们的网站需要加入客服聊天功能,实现方式各不相同同,对于流量不大的网站,可以加入qq聊天的链接,点击链接,会打开本地qq的聊天窗口, 和指定的人会话.实现方式很简单,就是一个<a>标 ...

  2. shell中if的可判断的类型

    -d :判断制定的是否为目录-z:判断制定的变量是否存在值-f:判断制定的是否为文件-L:判断制定的是否为符号链接-r:判断制定的是否可读-w:判断制定的是否可写-x:判断存在的对象是否可以执行!:测 ...

  3. 2、弹出窗口 Alert

    1.只是弹出框 /* --- page1.html ---*/ <ion-navbar *navbar> <ion-title>Tab 1</ion-title> ...

  4. JS数组遍历方法

    常用数组遍历方法: 1.原始for循环 var a = [1,2,3]; for(var i=0;i<a.length;i++){ console.log(a[i]); //结果依次为1,2,3 ...

  5. mysql 语句学习一 关于系统信息的查询

    首先说一下,SQL语句是不区分大小写的. 1.SELECT VERSION();           -- 查询当前版本号 2.SELECT CURRENT_TIME(); -- 查询当前时间 3.S ...

  6. 集合异常之List接口

    List接口介绍:是Collection接口中的子类, 特点: l  它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的).( ...

  7. wxpython 对话框

    . 消息对话框(wx.MessageDialog) 消息对话框 与用户通信最基本的机制是wx.MessageDialog,它是一个简单的提示框. wx.MessageDialog可用作一个简单的OK框 ...

  8. 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

    简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在 ...

  9. 注入类型(Injection Type)

    a) setter(重要) <property name="userDAO"> <ref bean="u"/> </propert ...

  10. [Err] 1214 - The used table type doesn't support FULLTEXT indexes

    -- -- Table structure for table `film_text` -- -- InnoDB added FULLTEXT support in 5.6.10. If you us ...