IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> P3746 [六省联考 2017] 组合数问题(倍增、dp) -> 正文阅读

[C++知识库]P3746 [六省联考 2017] 组合数问题(倍增、dp)

解析

再次被“组合数问题”吊打qwq
和上一次不一样的是,这次更加被恶心到了。
一方面受上一个组合数问题影响,另外出题人也十分阴间,一开始还给了个组合数的公式,更加使我坚定的认为这是一道数学推柿子题。
然后就开始各种打表+玩泥巴,没有任何卵用。
不过这题啥都不会暴力+几个部分分就有80,非常的棒,这考场谁还想正解啊

让我们回归组合数的最基本的意义: ( n m ) \binom n m (mn?) 表示从 n n n 个物品中选 m m m 个的方案数。
那么题目要求的其实就是: n n n 个物品中选出物品个数模 k k k 结果为 r r r 的方案数
能想到这里这题基本就做完了
这个东西似乎 openjudge 上还有一个题,当时是直接 O ( n k ? k ) O(nk*k) O(nk?k) 的复杂度来暴力做。
而这个背包的合并显然是具有结合律的,所以可以直接像快速幂一样倍增的求出答案。
总复杂度 O ( k 2 log ? ( n k ) ) O(k^2\log(nk)) O(k2log(nk))
(如果那个卷积用 FFT 的话也许可以做到 O ( k log ? k log ? ( n k ) ) O(k\log k\log (nk)) O(klogklog(nk))?)
但巨大常数感觉可能甚至跑不过暴力卷积

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;

const int N=1e6+100;
const int M=2e5+100;
const int inf=1e9;

inline ll read(){
	ll x(0),f(1);char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
int n,k,r;
int mod;
struct node{
	ll w[55];
	node(){memset(w,0,sizeof(w));}
};
node operator * (const node &a,const node &b){
	node res;
	for(int i=0;i<k;i++){
		for(int j=0;j<k;j++){
			(res.w[(i+j)%k]+=a.w[i]*b.w[j])%=mod;
		}
	}
	return res;
}
node ksm(node x,ll k){
	node res;
	res.w[0]=1;
	while(k){
		if(k&1) res=res*x;
		x=x*x;
		k>>=1;
	}
	return res;
}

signed main() {
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
#endif
	n=read();mod=read();k=read();r=read();
	node x;
	x.w[1%k]++;x.w[0]++;
	node ans=ksm(x,1ll*n*k);
	printf("%lld\n",ans.w[r]);
	return 0;
}
/*
*/

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:29  更:2022-03-21 20:30:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:50:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码