Codeforces 1105C Ayoub and Lost Array
Posted visualvk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1105C Ayoub and Lost Array相关的知识,希望对你有一定的参考价值。
题目大意:
一个长度为$n$的数组,其和能被$3$整除,且每一个数字满足$a_{i}in [l,r]$,问有多少种可以满足上述三个条件的数组
分析:
$dp$。$dp[i][j]=$前$i$个数构成余数为$j$的方案数,然后通过这个$dp$的定义,可以推出递推方程$dp[i][j]=sum_{i}^{2}dp[i][(j+k)%3]*n[k]$,其中$n[k]$为满足数字$a_{i}in [l,r]$余数为$k$的个数,而$n[k]$的求法也很简单,以余数为$1$为例,假设$a_{i}=3 imes m +1$,容易得到$lleq 3 imes m+1leq r$,即$frac{l-1}{3}leq kleq frac{r-1}{3}$,而其间的个数有为$lfloor frac{l-2}{3} floor -lfloor frac{r-1}{3} floor$,但是由于$-2$可能会出现$-1$或者$-2$,会影响到范围,所以我们两边都加上$3$,于是就变成了 $lfloor frac{l+1}{3} floor -lfloor frac{r+2}{3} floor$,另外两种情况计算同上。
code:
#define debug #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e7; const int MAXN = 1e3 + 10; const ll INF = 0x3f3f3f3f; const ll inf = 0x7fffff; const ll mod = 1e9 + 7; const int MOD = 10007; ll dp[maxn][3]; void solve() { ll n,l,r; cin>>n>>l>>r; ll nn[3]= {r/3-(l-1)/3,(r+2)/3-(l+1)/3,(r+1)/3-(l)/3}; dp[0][0]=1; for(int i=1; i<n+1; i++) { for(int j=0; j<3; j++) { for(int k=0; k<3; k++)dp[i][j]+=dp[i-1][(j+k)%3]*nn[(3-k)%3]%mod; dp[i][j]%=mod; } } cout<<dp[n][0]<<endl; memset(dp,0,sizeof(dp)); } int main(int argc, char const *argv[]) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef debug freopen("in.txt", "r", stdin); // freopen("out.txt","w",stdout); #endif int T=1; // cin>>T; while(T--) solve(); return 0; }
以上是关于Codeforces 1105C Ayoub and Lost Array的主要内容,如果未能解决你的问题,请参考以下文章
CF1105C Ayoub and Lost Array ——动态规划
Codeforces Round #619 (Div. 2) Ayoub's function
Codeforces Round #533 (Div. 2)C. Ayoub and Lost Array
Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array dp