C. Ayoub and Lost Array

链接

[https://codeforces.com/contest/1105/problem/C]

题意

给你n,表示数组长度,元素的值是l到r,问有多少种方案使得所有元素和整除3

分析

思维dp,看代码吧

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int N=2e5+10; 
ll dp[N][3];//dp[i][j]表示l,r这个区间内i个数的和取余3等于j的方案数 
int main(){
	ll n,l,r;
	//freopen("in.txt","r",stdin);
	while(~scanf("%lld%lld%lld",&n,&l,&r)){
		//容斥原理 
		int a=r/3-(l-1)/3;//l,r这个区间对3取余等于0的个数 
		int b=(r+2)/3-(l+1)/3;//l,r这个区间对3取余等于1的个数
		int c=(r+1)/3-l/3;//l,r这个区间对3取余等于2的个数
	    dp[1][0]=a,dp[1][1]=b,dp[1][2]=c;
	    for(int i=2;i<=n;i++)
	    {
	    	dp[i][0]=(dp[i-1][0]%mod*a%mod+dp[i-1][1]%mod*c%mod+dp[i-1][2]%mod*b%mod)%mod;
	    	dp[i][1]=(dp[i-1][0]%mod*b%mod+dp[i-1][1]%mod*a%mod+dp[i-1][2]%mod*c%mod)%mod;
	    	dp[i][2]=(dp[i-1][0]%mod*c%mod+dp[i-1][1]%mod*b%mod+dp[i-1][2]%mod*a%mod)%mod;
		}
		printf("%lld\n",dp[n][0]%mod);
	}
	return 0;
}
posted @ 2019-01-21 22:10  ChunhaoMo  阅读(413)  评论(0)    收藏  举报