luogu CF1105C AyoubとLost Array |動的プログラミング

タイトルの翻訳

長さ\(n \)\(1 \ leq n \ leq 2 \×10 ^ 5 \))のシーケンスがあり、各数値のサイズは\([l、r] \)\( 1 \ leq l \ leq r \ leq 10 ^ 9 \))。このシーケンスの合計を\(3 \)の倍数にするスキームの数を調べます答えはモジュロ\(10 ^ 9 + 7 \)です。もちろん、正当なシーケンスを形成できない場合、答えは\(0 \)です。

入力フォーマット

1行に3つの正の整数\(n \)\(l \)\(r \)

出力フォーマット

スキームの数値モジュール\(10 ^ 9 + 7 \)の結果を表す1行


#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;
}

おすすめ

転載: www.cnblogs.com/naruto-mzx/p/12689490.html