CF#553 C. Ayoub and Lost Array

版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/86633512

[好评] 简单的dp题目,类似于hdu一道滑稽树上掉滑稽果,求人在滑稽树下移动接到最多滑稽果的数量。只是这道题题意没有那么显然,dp菜菜,想了好久~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e6+10;
const ll mod=1e9+7;

int n,l,r;
ll dp[Max_n][3];

int main()
{
    scanf("%d%d%d",&n,&l,&r);
    ll a,b,c;
//    a=b=c=(r-l+1)/3;
//    for(int i=0;i<(r-l+1)%3;i++){
//        if((l+i)%3==0)a++;
//        else if((l+i)%3==1)b++;
//        else c++;
//    }
//    cout<<a<<b<<c<<endl;

    // 数位dp中的思想求区间内满足条件的数f(l,r)<=>f(r)-f(l-1)
    a=r/3-(l-1)/3;
    b=(r+2)/3-(l+1)/3;
    c=(r+1)/3-l/3;
    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]*a+dp[i-1][1]*c+dp[i-1][2]*b)%mod;
        dp[i][1]=(dp[i-1][0]*b+dp[i-1][1]*a+dp[i-1][2]*c)%mod;
        dp[i][2]=(dp[i-1][0]*c+dp[i-1][1]*b+dp[i-1][2]*a)%mod;
//        cout<<dp[i][0]<<dp[i][1]<<dp[i][2]<<endl;
    }
    cout<<dp[n][0]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/86633512