luogu CF1105C Ayoub and Lost Array |動態規劃
题意翻译
已知有一个长度为\(n\)(\(1\leq n\leq 2 \times 10^5\))的数列,每一个数的大小在\([l,r]\)(\(1\leq l \leq r \leq 10^9\))之间。求出有多少种方案使得这个数列的和为\(3\)的倍数。答案对\(10^9+7\)取模。当然,如果无法组成任何一个合法的数列,答案即为\(0\)。
输入格式
一行三个正整数\(n\),\(l\),\(r\)
输出格式
一行,表示方案数模\(10^9+7\)的结果。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1e9+7,N=2e5+10;
#define int long long
int n,l,r;
int a,b,c;
int dp[N][3];
signed main(){
cin>>n>>l>>r;
if(l%3==1)b++,l++;
if(l%3==2)c++,l++;
if(r%3==1)b++,r--;
if(r%3==0)a++,r--;
int op=(r-l+1)/3;
a+=op,b+=op,c+=op;
dp[0][0]=1;
for(int i=1;i<=n;i++){
dp[i][0]=(dp[i-1][0]*a%mod+dp[i-1][1]*c%mod+dp[i-1][2]*b%mod)%mod;
dp[i][1]=(dp[i-1][0]*b%mod+dp[i-1][1]*a%mod+dp[i-1][2]*c%mod)%mod;
dp[i][2]=(dp[i-1][0]*c%mod+dp[i-1][1]*b%mod+dp[i-1][2]*a%mod)%mod;
}
cout<<dp[n][0]<<endl;
}
不以物喜,不以己悲