首页 > 其他分享 >POJ - 3150

POJ - 3150

时间:2024-09-05 18:37:25浏览次数:3  
标签:mat int res rep d% 矩阵 3150 POJ

题解
题意:题面很臭很长。大意是,有一个大小为N的环,给出M,K,D,以及N个数。我们进行K次操作,每次操作把距离当前点不超过D的累加到当前点,结果模M。
思路:因为要进行K次,每次的原则是一样的,我们可以想到用矩阵来优化,如果i能到达j,把么base[i][j]=1;则结果ans=A(base^K)。
但是需要优化,时间复杂度为O(N^3
lgK)。我们发现矩阵是下一行由上一行右移一位而来,那么我们保存一维即可代表这个矩阵。同样的,我们只需要得到第一行的矩阵结果,就能得到整个矩阵的结果。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=510;
int N,Mod,D,K;
struct mat {
	int M[maxn];
	mat() {
		rep(i,1,N) M[i]=0;
	}
	mat friend operator*(mat a,mat b) {
		mat res;
		rep(k,1,N)
		rep(j,1,N) {
			res.M[j]=(res.M[j]+(long long)a.M[k]*b.M[j-k+1>0?j-k+1:j-k+1+N]%Mod)%Mod;
		}
		return res;
	}
	mat friend operator ^(mat a,int x) {
		mat res;
		rep(i,1,N) res.M[1]=1;
		while(x) {
			if(x&1) res=res*a;
			a=a*a;
			x/=2;
		}
		return res;
	}

};
int main() {
	scanf("%d%d%d%d",&N,&Mod,&D,&K);
	mat a,base;
	rep(i,1,N) scanf("%d",&a.M[i]);
	rep(i,1,N)
	if(i-1<=D||N-i+1<=D||N-1+i<=D) base.M[i]=1;
	a=a*(base^K);
	rep(i,1,N-1) printf("%d ",a.M[i]);
	printf("%d\n",a.M[N]);
	return 0;
}

标签:mat,int,res,rep,d%,矩阵,3150,POJ
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18399016

相关文章

  • POJ - 3150
    题解题意:题面很臭很长。大意是,有一个大小为N的环,给出M,K,D,以及N个数。我们进行K次操作,每次操作把距离当前点不超过D的累加到当前点,结果模M。思路:因为要进行K次,每次的原则是一样的,我们可以想到用矩阵来优化,如果i能到达j,把么base[i][j]=1;则结果ans=A(base^K)。但是需要优化,时间复杂......
  • POJ - 3296
    对于操作来说,第一次是最重要的,后来每次倒入水量是相同的。这是因为后面的总液体量不变的情况下,ans=第一次后液体浓度*后几次液体浓度的积所以由1/v^2<1/v^2-x^2(v,x>0),易得后几次水量相同那么,对于第一次来说可以用三分法来求极值。代码:#include<bits/stdc++.h>usingn......
  • POJ-1066
    题解告诉我:大意:在一个矩形区域内,有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越只能在中点穿越思路:需要巧妙的转换一下这个问题,因为从一个点到终点不可能“绕过”围墙,只能穿过去,所以门是否开在中点是无所谓的,只要求四周线......
  • POJ - 3318
    他说:O(n^3)是过不了滴一搜……6代码和题解没有实质区别:#include<cstdio>#include<ctime>#include<cstdlib>usingnamespacestd;inta[505][505],b[505][505],c[505][505];intmain(){ srand(time(NULL)); intn; ios::sync_with_stdio(0); cin.tie(0); while(cin......
  • POJ - 1765
    第一次做扫描线挺好的#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;structppx{ intl,r; doubleleft,right; doublelen; intcover;//记录重边情况}tree[4*200+10];doubley[200+10];//对应的序号装对应的边structpp{ doublex......
  • POJ - 1870
    先把蜂巢快递柜画出来:__________/\__/\__/\__/\____/\__/\__/53\__/\__/\__/\__/\__/52\__/54\__/\__/\\__/\__/51\__/31\__/55\__/\__//\__/50\__/30\__/32\__/56\__/\\__/49\__/29\__......
  • POJ - 3318
    他说:O(n^3)是过不了滴一搜……6代码和题解没有实质区别:#include<cstdio>#include<ctime>#include<cstdlib>usingnamespacestd;inta[505][505],b[505][505],c[505][505];intmain(){ srand(time(NULL)); intn; ios::sync_with_stdio(0); cin.tie(0); while(cin......
  • POJ - 2976
    原来是二分谁对平均分贡献大选谁界限<0.001,100次足矣#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintmaxn=1010;intn,k;doublemid;structNode{ doublea,b;}w[maxn];boolcmp(Nodex,Nodey......
  • POJ - 3071
    概率题。本蒟蒻不会概率dp,于是手搓枚举。反正爆枚够用后记:SadBee的想法考虑维护每队对上上一队/下一队的胜率。只有两队最简单,用1乘即可那多队呢?不如看成两队。见:P(1胜)=P(1战胜2)P(3战胜4)P(1战胜3)+P(1战胜2)P(4战胜3)P(1战胜4)P(2胜)=......
  • POJ1321-棋盘问题
    POJ从23号崩了,放弃POJ(也不知是不是有比赛把oj都关了),各大OJLeetcode/PAT各种花里胡哨开会员能数据,它不配正经刷题牛客网招聘多课程广告多我焦虑不想入hdoj和洛谷不错,找了找搜索算法的题目单,之前看过数一巨巨写的知乎:邝斌带你飞专题,无限回忆西安艾教培训,卿俊888上交知乎咨询,科技......