zoukankan      html  css  js  c++  java
  • BZOJ-3231 [SDOI2008]递归数列

    转成矩阵连乘后,矩阵快速幂加速解决。

    一开始没把需要longlong的变量补全。。而且没初始化2333

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #define rep(i, l, r) for(int i=l; i<=r; i++)
    #define clr(x, c) memset(x, c, sizeof(x))
    #define maxn 20
    #define ll long long
    #define l(x) x*2
    #define r(x) x*2+1
    using namespace std;
    inline ll read()
    {
    	ll x=0, f=1; char ch=getchar();
    	while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    	while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();
    	return x*f;
    }
    int n;
    ll q;
    ll m[maxn][maxn], m2[maxn][maxn], b[maxn], c[maxn], a[maxn], a2[maxn];
    
    ll Query(ll k)
    {
    	if (k<=n) {ll now=0; rep(i, 1, k) now+=b[i]; return now;} else k-=n;
    	clr(m, 0);
    	rep(i, 1, n) m[n][n+1-i]=m[n+1][n+1-i]=c[i];
    	rep(i, 1, n-1) m[i][i+1]=1; m[n+1][n+1]=1;
    	rep(i, 1, n+1) a[i]=b[i];
    	while (k)
    	{
    		if (k&1) 
    		{
    			clr(a2, 0);
    			rep(i, 1, n+1) rep(j, 1, n+1) a2[i]=(a2[i]+a[j]*m[i][j])%q;
    			rep(i, 1, n+1) a[i]=a2[i];
    		}
    		clr(m2, 0);
    		rep(i, 1, n+1) rep(j, 1, n+1) rep(o, 1, n+1) m2[i][j]=(m2[i][j]+m[i][o]*m[o][j])%q;
    		rep(i, 1, n+1) rep(j, 1, n+1) m[i][j]=m2[i][j]; 
    		k=k>>1;
    	}
    	return a[n+1];
    }
    
    int main()
    {
    	n=read();
    	rep(i, 1, n) b[i]=read(), b[n+1]+=b[i];
    	rep(i, 1, n) c[i]=read();
    	ll x=read(), y=read(); q=read();
    	rep(i, 1, n) b[i]%=q, c[i]%=q;
    	printf("%lld", (Query(y)-Query(x-1)+2*q)%q);
    	return 0;
    }
  • 相关阅读:
    bzoj3687 简单题
    bzoj3992 [SDOI2015]序列统计
    bzoj4602 [Sdoi2016]齿轮
    bzoj4006 [JLOI2015]管道连接
    szoj461【四校联考0430】挑战
    bzoj4037 [HAOI2015]数字串拆分
    javascript 节点的增,删,改,查
    javascript 节点属性详解
    表单操作部分
    文档对象的操作
  • 原文地址:https://www.cnblogs.com/NanoApe/p/4479924.html
Copyright © 2011-2022 走看看