ZOJ 3772 Calculate the Function
Fx 1 Ar 1 A l+2 F l
Fx-1 = 1 0 * .... * 1 0 * F l+1
행렬 곱하기 순서 주의...
Calculate the Function
Time Limit: 2 Seconds
Memory Limit: 65536 KB
You are given a list of numbers A1 A2 .. AN and M queries. For the i-th query:
You task is to calculate Fi(Ri) for each query. Because the answer can be very large, you should output the remainder of the answer divided by 1000000007.
Input
There are multiple test cases. The first line of input is an integer T indicates the number of test cases. For each test case:
The first line contains two integers N, M (1 <= N, M <= 100000). The second line contains N integers A1 A2 .. AN (1 <= Ai <= 1000000000).
The next M lines, each line is a query with two integer parameters Li, Ri (1 <= Li <= Ri <= N).
Output
For each test case, output the remainder of the answer divided by 1000000007.
Sample Input
1
4 7
1 2 3 4
1 1
1 2
1 3
1 4
2 4
3 4
4 4
Sample Output
1
2
5
13
11
4
4
Author:
CHEN, Weijie
Source:
The 14th Zhejiang University Programming Contest
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long int LL;
const int maxn=200000;
const LL MOD=1000000007;
struct MARTRIX
{
LL m[2][2];
MARTRIX operator*(const MARTRIX& b) const
{
MARTRIX ret;
ret.m[0][0]=((m[0][0]*b.m[0][0])%MOD+(m[0][1]*b.m[1][0])%MOD)%MOD;
ret.m[0][1]=((m[0][0]*b.m[0][1])%MOD+(m[0][1]*b.m[1][1])%MOD)%MOD;
ret.m[1][0]=((m[1][0]*b.m[0][0])%MOD+(m[1][1]*b.m[1][0])%MOD)%MOD;
ret.m[1][1]=((m[1][0]*b.m[0][1])%MOD+(m[1][1]*b.m[1][1])%MOD)%MOD;
return ret;
}
MARTRIX(LL a)
{
m[0][0]=1; m[0][1]=a;
m[1][0]=1; m[1][1]=0;
}
MARTRIX()
{
memset(m,0,sizeof(m));
}
}mrt[maxn<<2];
int n,m;
LL a[maxn];
void build(int l,int r,int rt)
{
if(l==r)
{
mrt[rt]=MARTRIX(a[l]);
return ;
}
int m=(l+r)/2;
build(lson); build(rson);
mrt[rt]=mrt[rt<<1|1]*mrt[rt<<1];
}
MARTRIX query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return mrt[rt];
}
int m=(l+r)/2;
if(R<=m)
return query(L,R,lson);
if(L>m)
return query(L,R,rson);
return query(L,R,rson)*query(L,R,lson);
}
int main()
{
int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",a+i);
build(1,n,1);
while(m--)
{
int L,R;
scanf("%d%d",&L,&R);
if(R<L+2)
{
printf("%lld
",a[R]%MOD);
continue;
}
MARTRIX mt=query(L+2,R,1,n,1);
printf("%lld
",((a[L+1]*mt.m[0][0])%MOD+(a[L]*mt.m[0][1])%MOD)%MOD);
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.