CF1105C Ayoub and Lost Array ——动态规划
题意:
一个整数数组,满足:
1. 长度为n
2. 所有元素都在[l, r]范围内
3. 所有元素的和能被3整除
给出n, l, r (1 ≤ n ≤ 2*10^5,1 ≤ l ≤ r ≤ 10^9)
请找出符合条件的数组的个数,答案对 10^9 + 7取模
首先我们要处理出[l, r]中对3取模得结果分别为0,1,2的数的个数,在一个合乎要求的数组中,结果为1和2的数的个数必然一样,由此就可以很方便地得到所有可能的组合的个数。但新的问题来了,由于可以选用相同的数,求出这些组合的排列数几乎是一个不可能完成的任务(对我这种蒟蒻来说)。
换一种思路,我们一个数一个数地添,并把所有可能的情况都考虑进去:
设dp[i][j]表示有i个数,且它们的和对3取模结果为j的数组个数,数组num[i]中记录了[l, r]中对3取模得结果为i的数的个数
显然dp[1][j] = num[j],随后,向已有的数组的尾部添加新的数字,例如:
dp[i][0] = dp[i - 1][0] * num[0] + dp[i - 1][1] * num[2] + dp[i - 1][2] * num[1]
dp[i][1]和dp[i][2]的情况同理,递推到n,dp[n][0]就是我们要的答案。
为什么是添加到尾部?不能插入到某个数字前吗?这样做会不会漏情况?
实际上,插入到某个数字之前会带来重复(会有另一个数被顶到尾部),举个例子:现在前i - 1个数的和对3取模结果为1,要添加一个结果为2的数,即dp[i - 1][1] * num[2],如果把它插入到前面,使一个对3取模结果为1的数被顶到了前面的话,显然就与dp[i - 1][2] * num[1]的情况重复了,另外两种情况同理。
附关键部分代码,欢迎纠错。
const int mod = 1e9 + ;
const int maxn = 2e5 + ;
ll dp[maxn][];//有i个数,且它们的和对3取模结果为j的数组个数
int main()
{
//num[i]记录了对3取模结果为i的数的个数
dp[][] = num[], dp[][] = num[], dp[][] = num[];
for(int i = ; i <= n; i++)
{
dp[i][] = (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod;
dp[i][] %= mod;
dp[i][] = (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod;
dp[i][] %= mod;
dp[i][] = (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod + (dp[i - ][] * num[]) % mod;
dp[i][] %= mod;
}
cout << dp[n][] << endl;
}
CF1105C Ayoub and Lost Array ——动态规划的更多相关文章
- C. Ayoub and Lost Array cf dp
C. Ayoub and Lost Array time limit per test 1 second memory limit per test 256 megabytes input stand ...
- Codeforces 1105C: Ayoub and Lost Array(递推)
time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: sta ...
- Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...
- C. Ayoub and Lost Array
链接 [https://codeforces.com/contest/1105/problem/C] 题意 给你n,表示数组长度,元素的值是l到r,问有多少种方案使得所有元素和整除3 分析 思维dp, ...
- Codeforces 1105C Ayoub and Lost Array (计数DP)
<题目链接> 题目大意: 有一个长度为 n 的数列的未知数列,数列的每一个数的值都在区间 [l,r] 的范围内.现在问你能够构成多少个这样的数组,使得数组内的所有数的和能够被 3 整除. ...
- C. Ayoub and Lost Array(DP)
(又是被队友带着上分的一场--) 题目链接:http://codeforces.com/contest/1105/problem/C 题目大意:给你n,l,r.每一个数都是在l,r范围之内,然后问你这 ...
- CF1155D Beautiful Array(动态规划)
做法 \(f_{i,0}\)表示以\(i\)结尾未操作时的最大值 \(f_{i,1}\)表示以\(i\)结尾正在操作时的最大值 \(f_{i,2}\)表示以\(i\)结尾已结束操作时的最大值 Code ...
- C. Ayoub and Lost Array Round #533 (Div. 2) 【DP】
一.题面 链接 二.分析 关于这题,两个点. 第一个点,是需要能够分析出$[L,R]$区间的3的余数的个数. 首先,可以得到,$[L,R]$区间内共有$(R-L+1)$个数. 设定余数为0,1,2的为 ...
- Codeforces Round #533(Div. 2) C.Ayoub and Lost Array
链接:https://codeforces.com/contest/1105/problem/C 题意: 给n,l,r. 一个n长的数组每个位置可以填区间l-r的值. 有多少种填法,使得数组每个位置相 ...
随机推荐
- 封装RF keyword
*** Settings ***Library SeleniumLibrary *** Keywords ***打开浏览器 [Arguments] ${url} ${browser} Open Bro ...
- 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析
streams 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析 packet packet实现ps的相关封装和解析, example/enc 通过joy4来读本地视频文件,然后调用Rt ...
- 比较两个Sql数据库是否相同
1.打开VS20122.SQL→架构比较→新建架构比较3.在源和目标上分别填上两个待比较的数据库的信息4.点击比较,不一会儿,系统就会列出两个数据库的差异了.
- 动态规划—triangle
题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...
- flask之显示当地时间
一:在网页上显示时间 flask-moment 程序扩展可以实现 pip install flask-moment # 未完待续
- 小米笔记本pro版bios经常找不到硬盘
自从买了小米笔记本,对小米的印象大大折扣,bios经常找不到硬盘,关机,重启,就好了. 到小米售后,售后说是系统坏了,我说bios里都找不到.他说,系统坏了也会出现这个情况.我说好吧.重做后,没用几天 ...
- ReactNative的学习笔记
一.安装nodejs 查看是否安装:npm -v 二.安装react-native命令工具 npm install -g react-native-cli 三.查看 react-native --he ...
- 新建 SecondFragment 实现类
package com.test.mvp.mvpdemo.mvp.v6.view; import android.os.Bundle;import android.support.annotation ...
- 无缝轮播的案例 及css3无缝轮播案例
无缝轮播的案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- loj#2332 「JOI 2017 Final」焚风现象
分析 我们发现改变一个区间实际上只有两个端点的贡献变换 代码 #include<bits/stdc++.h> using namespace std; #define int long l ...