• Codeforces 1105C Ayoub and Lost Array


    题目大意:

      一个长度为$n$的数组,其和能被$3$整除,且每一个数字满足$a_{i}in [l,r]$,问有多少种可以满足上述三个条件的数组

    分析:

      $dp$。$dp[i][j]=$前$i$个数构成余数为$j$的方案数,然后通过这个$dp$的定义,可以推出递推方程

                $dp[i][j]=sum_{j=0}^{2}sum_{k=0}^{2}dp[i][ (j+k)\%3 ] imes n[(3-k)\%3]$

    其中$n[(3-k)\%3]$为满足数字$a_{i}in [l,r]$余数为$k$的个数,而$n[k]$的求法也很简单。

      以余数为$1$为例,假设$a_{i}=3cdot m +1$,容易得到$lleq 3cdot 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;
    }
    

     

      

     

  • 相关阅读:
    vue 之 数据传递(子传父,父传子,非父子通信<事件总线>,父取子<ref,$refs>,插槽,provide和inject数据传递)
    vue 之 $ref 和 $refs
    node 之 身份认证(cookie,session,token<jwt>)
    vue 之 事件总线(订阅者模式,非父子间的数据传递)
    node 之 模块汇总
    node 之 web开发模式
    node 之 路由(待完善)
    node 之 浏览器跨域问题(待完善)
    Apache配置URL重定向
    自定义去除博客园底部的广告和链接推荐
  • 原文地址:https://www.cnblogs.com/visualVK/p/10343518.html
Copyright © 2020-2023  润新知