首页 > 其他分享 >【题解】U281338 分书

【题解】U281338 分书

时间:2023-02-18 17:45:57浏览次数:64  
标签:Matrix NN int 题解 ll 矩阵 res U281338

自创题题目解析

考虑可以先去看Sam数

从标签我们可以知道,需要使用矩阵加速

考虑这道题一眼看出是一道DP题(毕竟是熟悉的背包加了一个上限)

再看每一种人的人数\(10^9\)!(蒙了)

我们从数据范围知道该去用一个优化算法(或者是结论题),那到底是什么呢?

组合数学?好像有一点难,出题人好像故意把模数设成了\(~998244354~\)(到底能不能做给大家留下思考空间)

怎么办,这时你发现,它和Sam数这道题一样,都没有上限!!!

这矩阵好像和Sam数差不多耶,只要构造一个\(m \times m\)的递推矩阵即可。

但是\(~n~\)种人怎么搞?

……思考中

当然是直接乘起来完事啦!

下面是code:

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const ll NN = 3e2 + 8,MOD = 998244354;
inline ll read(){
	register ll res = 0,flag = 1;
	register char c = getchar();
	while(!isdigit(c)){
		if(c == '-')flag = -1;c = getchar();
	}
	while(isdigit(c)){
		res = res * 10 + c - '0';
		c = getchar();
	}
	return res * flag;
}//快读
inline ll calc(ll x,ll y){
	ll r = x + y;
	return r - (r >= MOD ? MOD : 0);
}//取模意义下加法加速
ll n,m;
ll A[NN],B[NN];
struct Matrix{
	ll a[NN][NN];
	void clear(){
		memset(a,0,sizeof(a));
	}//清空矩阵
	Matrix operator * (Matrix &x){
		Matrix c;c.clear();
		for(int l = 0; l <= m; ++l){
			for(int i = 0; i <= m; ++i){
				for(int j = 0; j <= m; ++j){
					c.a[i][j] = calc(c.a[i][j],a[i][l] * x.a[l][j] % MOD);
				}
			}
		}
		return c;
	}//矩阵乘法
	void get(int x){
		for(int i = 0; i <= m; ++i){
			for(int j = i; j >= max(0,i-x); --j){
				a[j][i] = 1;
			}
		}
	}//构造递推矩阵
	void init(){
		for(int i = 0; i <= m; ++i)a[i][i] = 1;
	}//构造单位矩阵
}ans,ori,res,cal;
Matrix ksm(Matrix &x,ll k){
	cal = x;
	res.clear();res.init();
	while(k){
		if(k&1)res = res * cal;
		cal = cal * cal;
		k >>= 1;
	}
	return res;
}//矩阵快速幂
ll r;
int main(){
	n = read(),m = read();
	ans.a[0][0] = 1;
	for(int i = 1; i <= n; ++i)A[i] = read();
	for(int i = 1; i <= n; ++i)B[i] = read();
	for(int i = 1; i <= n; ++i){
		ori.clear();ori.get(A[i]);
		ori = ksm(ori,B[i]);
		ans = ans * ori;
	}
	for(int i = 0; i <= m; ++i){
		r = calc(r,ans.a[0][i]);
	}
	printf("%lld",r);
	return 0;
}

标签:Matrix,NN,int,题解,ll,矩阵,res,U281338
From: https://www.cnblogs.com/rickylin/p/17133150.html

相关文章

  • P5902 [IOI2009] salesman 题解
    题目链接题意船向上游移动1米花费\(U\)元,向下移动1米花费\(D\)元。沿河有\(N\)个展销会,对于第\(i\)个展销会,它的日期为\(T_i\),它的位置为\(L_i\),可获得盈......
  • YACS 2023年2月月赛 甲组 T1 自由贸易 题解
    题目链接上来一看题和数据范围基本就是DP了,问题是状态怎么设计呢?如果我们仅仅设$f[i]$为到第$i$个水果时的最大分数,那么显然会发现无法处理当前水果的分数贡献。......
  • ARC111C Too Heavy 题解
    无解的情况:当且仅当一个人手上的物品不是自己的物品,并且这个物品的质量大于自己的体重,这个不是自己的东西就卡手了,换不出去,无解。甲手上是乙的物品。乙的手上是丙的物品,丙......
  • NOIP2022 简要题解
    前言作为一名退役OIer,借着此比赛来复健。大部分题目都是口胡(没啥好写的),spj题手写了代码,A了。难度不算特别高,但是赛场上拿到高分略有压力(退役了可以瞎bb)。个人认为应该......
  • 题解 CF690C2
    题目大意:给你一棵树,求一下直径题目分析:emm,怎么说吧,就是树的直径的裸板子。可能有人不大理解,明明是图,你为什么要说是给定一棵树。大家可以自行验证一下,满足如下两个性......
  • 题解 CF690C1
    题目大意:给定一张\(n\)个点\(m\)条边的无向图,判断这是不是一棵树。题目分析:两种思路:思路一:不需要建图,直接使用并查集判环即可最后判断一下图联不联通就行,具体方......
  • 一个autoreconf的报错问题解决
    报错如下configure.ac:36:error:possiblyundefinedmacro:AC_CHECK_LIBIfthistokenandothersarelegitimate,pleaseusem4_pattern_allow.Seet......
  • 题解 CF637B
    题目大意:维护个栈,去重保留最上层题目分析:啥也不是,数组模拟\(\text{stack}+\text{unordered\_map}\)直接秒掉。复杂度\(O(n)\)代码实现:#include<bits/stdc++.h>......
  • 题解 CF742B
    题目大意:给定\(n\)个数,找数对使其异或值为\(k\),求满足这样数对的个数。题目分析:考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质:\[\begin{aligned}\bec......
  • 20230207模拟赛题解
    A-CF755D考虑每次加边产生的贡献。发现每次加边的贡献是这条边与别的边的交点数量加\(1\)。所以可以用线段树或树状数组等数据结构维护,注意要令\(k=\min(k,n-k)\)。B-......