【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)
2024-08-26 09:42:46
洛谷P1066:https://www.luogu.org/problemnew/show/P1066
思路
挺难的一道题 也很复杂
满足题目要求的种数是两类组合数之和
r的最多位数m为
- w/k(当w mod k=0 时)
- 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
}
最新文章
- HTTPS那些事(一)HTTPS原理
- SQLMAP 中$与#的区别
- [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
- ubuntu搭建svn服务器(转)
- Mongodb的范式化和反范式化
- bounds的深入研究
- SQL Server 2005恢复数据库详细图文教程
- PHPCMS 使用图示和PHPCMS二次开发教程(转)
- C# 温故而知新:Stream篇(—)
- JAVA之成员变量初始化
- 快速学习Bash
- HashTable源码阅读
- js 控制光标到指定位置
- ViewHolder模式的简洁写法
- Ubuntu16.04多个版本GCC编译器的安装和切换
- 华硕飞马3S,日常使用续航测试
- wfp(Application的运用)
- VMware Workstation 不可恢复错误 解决方法
- Centos配置vsftpd
- LeetCode题解之Binary Number with Alternating Bits
热门文章
- TOJ 2641 Gene
- one-vs-all案例
- mvc 中Request[";";]与Request.QueryString[";";]
- Investigating issues with Unmanaged Memory. First steps. (转载)
- Java开发团队管理细则
- 关于c3p0连接池连接mysql数据库需要注意的几点
- iOS Touch ID 简易开发教程
- 【Linux】 Linux编程规范&;Linux 编程环境搭建
- 【读书笔记】如何高效学习(Learn More ,Study Less)
- Mac系统在finder拦显示当前所浏览的文件路径的方法