链接: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; }