博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1105C Ayoub and Lost Array
阅读量:5167 次
发布时间:2019-06-13

本文共 1074 字,大约阅读时间需要 3 分钟。

题目大意:

  一个长度为$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 ] \times n[(3-k)\%3]$

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

  以余数为$1$为例,假设$a_{i}=3\cdot m +1$,容易得到$l\leq 3\cdot m+1\leq r$,

          即$\frac{l-1}{3}\leq k\leq \frac{r-1}{3}$,

而其间的个数有为$\lfloor  \frac{l-2}{3} \rfloor -\lfloor  \frac{r-1}{3} \rfloor$,但是由于$-2$可能会出现$-1$或者$-2$,会影响到范围,所以我们两边都加上$3$,于是就变成了 $\lfloor  \frac{l+1}{3} \rfloor -\lfloor  \frac{r+2}{3} \rfloor$,另外两种情况计算同上。

code:

 

#define debug#include 
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
>T; while(T--) solve(); return 0;}

 

  

 

转载于:https://www.cnblogs.com/visualVK/p/10343518.html

你可能感兴趣的文章
计算圆的面积
查看>>
css实现两端对齐的3种方法
查看>>
制造抽象基类--《C++必知必会》 条款33
查看>>
BitMap的原理以及运用
查看>>
shell访问mysql
查看>>
开博第一篇
查看>>
第四次实验
查看>>
TableView上的HeaderView放WebView
查看>>
现状分析
查看>>
阿里图标的引用
查看>>
Alpha 冲刺 (8/10)
查看>>
添加个人专栏
查看>>
echarts的时间线图表
查看>>
C#读取EXCEL数据
查看>>
UVa 111 History Grading (最长公共子序列)
查看>>
linux基本命令
查看>>
Oracle插入日期格式出现 ORA-01843: not a valid month的解决办法
查看>>
HashSet的实现原理
查看>>
Java HashMap 分析之四:查找和内存使用
查看>>
《与熊共舞》——软件项目风险管理
查看>>