ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luogu P7016 [CERC2013]Captain Obvious and the Rabbit-Man

2021-06-15 19:33:15  阅读:186  来源: 互联网

标签:方程 luogu long Fib CERC2013 Obvious include 高斯消 define


题面传送门
这个东西你显然不能写个高斯消元\(O(n^3)\)弄过去。
但是这个系数又是那么的有规律。
所以我们考虑一种人为构造的消元办法使得其一定能消完所有未知数,这样我们只要考虑等式右边的加减即可。
先把最后要求的方程扔在最后面然后最后取相反数即可。
首先仿照高斯消元的方法我们先考虑给第一项消掉,显然是每个方程减去前面那一项的\(Fib_{1}\)倍。
然后考虑第二项,最后一个方程的系数第二项已经变成了\(Fib_2^{n}(Fib_2-Fib_1)\)
但是前面那个也已经变成了\(Fib_2^{n-1}(Fib_2-Fib_1)\),这样的话我们还是可以直接解决。
然后依次处理即可。时间复杂度\(O(Tn^2)\)
code:

#include <vector>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<set>
#include<map>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define N 4000
#define eps (1e-5)
#define mod (1<<31)
#define U unsigned int
int n,M,T;ll F[N+5],Fib[N+5];
int main(){
	freopen("1.in","r",stdin);
	re int i,j;scanf("%d",&T);while(T--){
		scanf("%d%d",&n,&M);Fib[1]=1;Fib[2]=2;for(i=3;i<=n;i++) Fib[i]=(Fib[i-1]+Fib[i-2])%M;
		for(i=1;i<=n;i++) scanf("%d",&F[i]);F[n+1]=0;
		for(i=1;i<=n;i++){
			for(j=n;j;j--)F[j+1]=(F[j+1]-F[j]*Fib[i]%M+M)%M;
		}
		printf("%lld\n",(M-F[n+1])%M);
	}
} 

标签:方程,luogu,long,Fib,CERC2013,Obvious,include,高斯消,define
来源: https://www.cnblogs.com/275307894a/p/14886797.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有