洛谷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. nyoj 364——田忌赛马——————【贪心】

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...

  2. Java学习第二十一天

    1:字符流(掌握) (1)字节流操作中文数据不是特别的方便,所以就出现了转换流. 转换流的作用就是把字节流转换字符流来使用. (2)转换流其实是一个字符流 字符流 = 字节流 + 编码表 (3)编码表 ...

  3. Android界面编程--使用活动条(ActionBar)--实现Tab导航

    使用ActionBar结合fragment实现导航 1,调用ActionBar的setNavigationModel(ActionBar.NAVIGATION_MODE_TABS)设置使用tabs导航 ...

  4. c#学习基础(2)存储、值类型和引用类型、变量

    程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in ...

  5. javascript 实现函数/方法重载效果

    什么是重载? 在C#和JAVA等编程语言中函数重载是指在一个类中可以定义多个方法名相同但是方法参数和顺序不同的方法,以此来实现不同的功能和操作,这就是重载. JS没有重载,只能模拟重载 一般来说,如果 ...

  6. js之方法

    原文 在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们 ...

  7. python 爬虫初试

    python3.5  抓网易新闻的排行榜上的新闻,主要用自带的request模块和lxml import re from urllib import request from lxml import ...

  8. twaver拓扑图通道组织图(百分比使用率/水槽)效果实现

    功能介绍: 利用拓扑图实现:64条通道,根据每条通道是否承载业务,提供百分比展示 首先上图,功能效果如图: 废话不多,直接上代码: <!DOCTYPE html> <html> ...

  9. Spring MVC 如何加载静态html

    在spring mvc的xml文件最后面加上下面这一行<mvc:deault-servlet-handler/>

  10. 对synchronized(this)的一些理解

    一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. ...