ICPC2019 沈阳网络赛 K.Guanguan's Happy water(高斯消元+逆元+矩阵快速幂)

题目链接

https://nanti.jisuanke.com/t/41411

思路

怎么说呢,这题就是让你先解模线性方程组,然后用矩阵快速幂算数列前n项和。虽说跟模板题很接近但也有160多行代码,我觉得写起来还是很繁琐的,调试起来也不简单。这里不多说了,就把这题当作高斯消元模板记录一下吧。

代码

#include 
#define ll long long
using namespace std;
const ll maxn=80;
const ll mod=1e9+7;
typedef ll Mat[maxn][maxn];
ll p[maxn],f[maxn*2],sum[maxn*2],n,k;
Mat A;
void read(ll &x)
{
    ll f=1;x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}

//高斯消元部分 
//填数 
void solve(){
    memset(A,0,sizeof(A));
    ll cur=k+1;
    //cout<<"f"<>=1;
    }
    return ret;
}
ll inv(ll v,ll modd){
    return pow_mod(v%modd,modd-2,modd);
}

void gauss_elimin(){
    for(ll i=0;i=0;i--){
        for(ll j=i+1;j>=1;
    }
    return ans;
}
 
//填写矩阵 
ll work(){
	ll i,j;
	for(i=1;i<=len;i++)
        e.mt[i][i]=1;
    memset(a.mt,0,sizeof(a.mt));
    for(i=1;i<=len;i++){
    	if(i==1){
    		a.mt[1][1]=1; 
    		for(j=2;j<=len;j++){
    			a.mt[1][j]=p[j-2];
    		}
    		continue;
    	}
    	if(i==2){
    		for(j=2;j<=len;j++){
    			a.mt[2][j]=p[j-2];
    		}
    		continue;
    	}
    	a.mt[i][j-1]=1;
    }
    matt al=pow(a,n-2*k);
    ll xx[maxn],x[maxn],ans=0;
    for(i=1;i<=k;i++)xx[i]=f[k+i];xx[k+1]=sum[2*k];
    for(i=1;i<=len;i++)x[len-i+1]=xx[i];
	for(i=1;i<=len;i++){
		ans+=al.mt[1][i]*x[i];
		ans%=mod;
	}
    return ans;
}


int main(){
    ll cas;
    read(cas);
    while(cas--){
        read(k);read(n);len=k+1;
		for(ll i=1;i<=2*k;i++)read(f[i]);
		memset(sum,0,sizeof(sum));
		for(ll i=1;i<=2*k;i++){
			sum[i]=sum[i-1]+f[i];
			sum[i]%=mod;
		}
		if(n<=2*k){
			cout<

 

你可能感兴趣的:(数论,高斯消元)