Codeforces 1105C (DP)
题面
分析
这种计数问题,要不是纯数学推公式,要不就是dp
先处理出[l,r]中除3余0,1,2的数的个数,记为cnt0,cnt1,cnt2
设\(dp[i][j]\)表示前i个数的和除3余j的个数
则\(dp[1][0]=cnt0,dp[1][1]=cnt1,dp[1][2]=cnt2\)
最终答案为\(dp[n][0]\)
状态转移方程为
\(dp[i][0]=dp[i-1][0]*cnt0+dp[i-1][1]*cnt2+dp[i-1][2]*cnt1\)
\(dp[i][1]=dp[i-1][1]*cnt0+dp[i-1][2]*cnt2+dp[i-1][0]*cnt1\)
\(dp[i][2]=(dp[i-1][2]*cnt0+dp[i-1][0]*cnt2+dp[i-1][1]*cnt1\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200005
#define mod 1000000007
using namespace std;
int n;
long long l,r;
long long cnt0,cnt1,cnt2;
long long dp[maxn][3];
int solve(int x,int k){
int t;
if(x%3==0) t=3;
else t=x%3;
return (x-t)/3+(x%3==k);
}
int main(){
scanf("%d %I64d %I64d",&n,&l,&r);
int l1,l2,l3;
l1=l%3;
l2=(r+1-l);
l3=l2%3;
l2=l2/3;
cnt1=cnt2=cnt0=l2;
if(l3==1){
if(l1==1) cnt1++;
else if(l1==2) cnt2++;
else cnt0++;
}
if(l3==2){
cnt1++,cnt2++,cnt0++;
if(l1==1) cnt0--;
else if(l1==2) cnt1--;
else cnt2--;
}
dp[1][0]=cnt0;
dp[1][1]=cnt1;
dp[1][2]=cnt2;
for(int i=2;i<=n;i++){
dp[i][0]=(dp[i-1][0]*cnt0%mod+dp[i-1][1]*cnt2%mod+dp[i-1][2]*cnt1)%mod;
dp[i][1]=(dp[i-1][1]*cnt0%mod+dp[i-1][2]*cnt2%mod+dp[i-1][0]*cnt1)%mod;
dp[i][2]=(dp[i-1][2]*cnt0%mod+dp[i-1][0]*cnt2%mod+dp[i-1][1]*cnt1)%mod;
}
printf("%I64d\n",dp[n][0]);
}
Codeforces 1105C (DP)的更多相关文章
- Codeforces 1105C Ayoub and Lost Array (计数DP)
<题目链接> 题目大意: 有一个长度为 n 的数列的未知数列,数列的每一个数的值都在区间 [l,r] 的范围内.现在问你能够构成多少个这样的数组,使得数组内的所有数的和能够被 3 整除. ...
- Two Melodies CodeForces - 813D (DP,技巧)
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- CodeForces 607C (DP) Hard problem
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...
- Codeforces 611d [DP][字符串]
/* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...
- Codeforces 404D [DP]
/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...
- Codeforces 119C DP
题意: 有n天,m门课和常数k; 每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c. 1<=a<=b<=1e16 c<=100 1<=n<=m ...
随机推荐
- [好好学习]在VMware中安装Oracle Enterprise Linux (v5.7) - (3/5)
进入OEL
- Asp.Net 保存Session的三种方式
一.默认方式,保存在IIS进程中保存在IIS进程中是指把Session数据保存在IIS的运行的进程中,也就是inetinfo.exe这个进程中,这也是默认的Session的存方式,也是最常用的. 这种 ...
- int型、char*、string、的swap算法
1.俩整数,不使用中间变量交换其值: int& intswap(int& a, int& b) { b ^= a; a ^= b; b ^= a; return b; } 2. ...
- django之静态文件的设置
一:静态文件 Django中提供了一种解析的方式配置静态文件路径.静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理. 为了提 ...
- 031:verbatim 标签
verbatim 标签: verbatim 标签:默认在 DTL 模板中是会去解析那些特殊字符的.比如 {% 和 %} 以及 {{ 等.如果你在某个代码片段中不想使用 DTL 的解析引擎.那么你可以把 ...
- Dubbo学习-4-dubbo简单案例-2-服务提供者和消费者配置
在上一篇帖子的基础上,开始使用dubbo来实现RPC调用: 根据dubbo的架构图可知,需要做以下几件事情: 1.将服务提供者注册到注册中心(暴露服务) (1)引入dubbo依赖, 这里依赖2.6.2 ...
- PHP截取字符串函数,根据dede修改而来
dede中,有一个函数function cn_substr_utf8($str, $length, $start=0) 但测试时,并不如我所想的一样,可能是因为个人使用习惯吧.比如,字符串为数字或字母 ...
- swan.onPageNotFound
解释: 监听小程序要打开的页面不存在事件.该事件与 App.onPageNotFound 的回调时机一致. 方法参数: Function callback小程序要打开的页面不存在的事件回调函数. ca ...
- 前端开发本地存储之cookie
1.cookie cookie是纯文本,没有可执行代码,是指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端(浏览器)上的数据(通常经过加密).当用户访问了某个网站的时候,我们 ...
- Netty学习笔记(一)
学习圣思园Netty笔记,个人理解 2.netty宏观理解-本节内容: 1.阶段性事件驱动,一个请求分为若干阶段处理,每个阶段根据情况合理分配线程去处理,各阶段间通信采用异步事件驱动方式. 2.net ...