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

猜你喜欢

转载自www.cnblogs.com/mch5201314/p/10301308.html
今日推荐