C.Ayoub and Lost Array

链接:https://codeforces.com/contest/1105/problem/C

题意:

给n,l,r。

一个n长的数组每个位置可以填区间l-r的值。

有多少种填法,使得数组每个位置相加的和是3的倍数

思路:

赛后看代码都看不懂的题。

dp,

从1个数组扩展到n个数组,

dp[i][j]是加上第i个数组后,分别余0,1,2的个数。

余0则是,i-1余0*自己余0+(i-1余1*自己余2)+(i-1余2*自己余1)

剩下同理

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2*1e5+10;
const int MOD = 1e9+7;
LL dp[MAXN][3];

int main()
{
    int n,l,r;
    cin >> n >> l >> r;
    dp[0][0] = 1,dp[0][1] = 0,dp[0][2] = 0;
    int mod0 = r/3-(l-1)/3,mod1 = (r+2)/3-(l+1)/3,mod2 = (r+1)/3-(l)/3;
    for (int i = 1;i<=n;i++)
    {
        dp[i][0] = (dp[i-1][0]*mod0%MOD+dp[i-1][1]*mod2%MOD+dp[i-1][2]*mod1%MOD)%MOD;
        dp[i][1] = (dp[i-1][0]*mod1%MOD+dp[i-1][1]*mod0%MOD+dp[i-1][2]*mod2%MOD)%MOD;
        dp[i][2] = (dp[i-1][0]*mod2%MOD+dp[i-1][1]*mod1%MOD+dp[i-1][2]*mod0%MOD)%MOD;
    }
    cout << dp[n][0] << endl;

    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/YDDDD/p/10297683.html