Bzoj4870 [SXOI2017]组合数问题
Submit: 155 Solved: 78
Description
Input
Output
Sample Input
Sample Output
HINT
Source
黑吉辽沪冀晋六省联考
数学问题 组合数
震惊!考场上花式骗分竟然可以拿到80分!
正解:
这个东西当然没有什么既成的公式,需要用DP推公式,和平常的公式推DP正好反过来了。
发现这个式子的项覆盖了nk内所有%k==r的位置,那么可以考虑这个式子的组合意义——
在全部nk个物品中,选出任意个物品使得选出的物品数%k==r的方案数!
设f[考虑到第i个物品][选出数量%k==j]=方案数,于是变成了可以$O(n^3)$推出来的背包问题?
还可以更加简单粗暴,$f[2n][(i+j)%k]=\sum f[n][i]*f[n][j] $ $O(n^2 logn)$倍增出解。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 #define LL long long 9 using namespace std; 10 const int mxn=100010; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10-'0'+ch;ch=getchar();} 15 return x*f; 16 } 17 int n,P,k,r; 18 struct num{ 19 int x[52]; 20 void init(){ 21 memset(x,0,sizeof x); 22 } 23 }f; 24 num calc(const num &a,const num &b){ 25 num res; 26 res.init(); 27 for(int i=0;i<=k;i++) 28 for(int j=0;j<=k;j++) 29 (res.x[(i+j)%k]+=(LL)a.x[i]*b.x[j]%P)%=P; 30 return res; 31 } 32 num ksm(num a,LL t){ 33 num res; 34 res.init();res.x[0]=1; 35 while(t){ 36 if(t&1)res=calc(res,a); 37 a=calc(a,a); 38 t>>=1; 39 } 40 return res; 41 } 42 int main(){ 43 int i,j; 44 n=read();P=read();k=read();r=read(); 45 f.x[0]=1; 46 f.x[1%k]+=1; 47 f=ksm(f,(LL)n*k); 48 // for(i=0;i<=k;i++)printf("%d\n",f.x[i]); 49 printf("%d\n",f.x[r]); 50 return 0; 51 }
转载于:https://www.cnblogs.com/SilverNebula/p/6764493.html
Bzoj4870 [SXOI2017]组合数问题相关推荐
- 退役前的做题记录2.0
退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...
- Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)
做这样的比赛既考快速编码的能力,还有快速思维的能力.本人很弱,跌了rating..加油!!!.. 第一题上来就把题意理解错了..粗心啊..直接模拟着做就行:1:如果字符串全是大写字母就进行大小写转换: ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- 多重集表示合json数据_计数DP(划分数,多重集组合数)
划分数:把n个无区别的物品划分成不超过m组. dp[i][j]=j的i划分的总数. dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 ...
- 【ACM】杭电OJ 4704 Sum (隔板原理+组合数求和公式+费马小定理+快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=4704 1.隔板原理 1~N有N个元素,每个元素代表一个1.分成K个数,即在(N-1)个空挡里放置(K-1)块隔板 ...
- [Leetcode] Combinations 组合数
Combinations Given two integers n and k, return all possible ombinations of k numbers out of 1 ... n ...
- 组合数函数-快速提取所有可能的组合数
组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数. 代码: str_comb <- function(vector){n <- le ...
- 不使用递归求全排列和组合数
同学遇到的面试问题,大意是M台机器放在N个房间,不使用递归求打印所有情况 解题思路:情况共计N**M种.开始想将所有情况放入数组,填充好数组再逐个打印.随后发现按照填充的思路,不使用大数组也可以实现. ...
最新文章
- Vivado 中IP报严重警告Could not find module的解决办法
- 数据中心服务器机架是什么?
- Matlab中设置图形窗口的大小、字体、axis等
- 【LeetCode】LC1672. 最富有客户的资产总量
- python扩展库简介_python非官方扩展库
- Zookeeper的节点操作
- 安卓编程用什么软件_震惊!安卓IOS都可以用的牛逼软件
- 的环境下 qt 运行在_Ubuntu16.04环境下运行vins mono(环境配置及编译)之ROS kinetic的安装...
- Java-类和对象、关键字、构造方法
- socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- ListenalbeFuture的使用总结
- 小米6Android11刷机包,小米6刷机包MIUI12
- C语言中多个 \n 作用
- 【深入浅出flink】第7篇:从原理剖析flink中所有的重分区方式keyBy、broadcast、rebalance、rescale、shuffle、global、partitionCustom
- 小程序容器对政务服务平台建设的帮助
- 迪杰斯特拉算法(dijkstra)
- php 把数字大写,php 阿拉伯数字转中文大写金额
- 机器学习实战之信用卡欺诈案列
- echarts 折线图
- PC 网易云音乐桌面歌词原版天际蓝配色方案
热门文章
- cisco显示ip地址_cisco视频会议,会议室两台电视、一个投影线路如何连接布线
- 卧式储罐液位体积计算公式excel_2020晋中化工防腐储罐订做欢迎来电-环保设备...
- mysql 恢复root权限_Linux MySQL root权限恢复[图文]
- java旅客接口_GitHub - s1mplecc/checkin-scheduler: 使用 Java 实现的旅客人数分布预估与值机排班调度算法...
- java程序流程_java程序流程控制
- linux怎么查看服务器主频,Linux环境下查看服务器硬件信息
- java 不规则图形_java 根据点画不规则封闭图形
- 浏览器访问sftp服务器_Mountain Duck for Mac(FTP服务器管理工具)v4.0.0.16698
- 基于深度学习的自然场景文字检测及端到端的OCR中文文字识别
- php zip 不能创建文件,PHP无法访问新创建的zip文件