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 ...
随机推荐
- windows 10 自动升级后环境变量无效
上个礼拜放假的时候,win10提示需要升级,我当时随手就一点更新并关机...今天,在启动项目时候尴尬了: D:\project\js\iam-web\code\iam-web>npm run d ...
- 2019-8-14-win10-使用-SMB-v1
title author date CreateTime categories win10 使用 SMB v1 lindexi 2019-08-14 08:55:55 +0800 2018-2-13 ...
- C++宽字符串转字符串
这文章是更改别人代码 #include <string> #include <iostream> #include <stdlib.h> #include < ...
- 2019南京网赛 The beautiful values of the palace(思维,树状数组
https://nanti.jisuanke.com/t/41298 题意:给一个n * n的螺旋矩阵,n保证是奇数,取一些点使其.获得价值,价值为数位和,然后再给q次查询,求矩阵中的价值总和 思路: ...
- ps:点阵格式图像
我们所看到的图像,究竟是如何构成的呢?这就需要涉及到图像类型的概念. 电脑中的图像类型分为两大类,一类称为点阵图,一类称为矢量图. 点阵图顾名思义就是由点构成的,如同用马赛克去拼贴图案一样,每个马赛克 ...
- bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...
- thinkphp 视图view
一. 继承Controller类 <?php namespace app\index\controller; use http\Params; use think\Config; use thi ...
- 关于Extjs获取容器和元素的方法
1.当前对象的父对象(上级对象) this.ownerCt: 2.当前对象的下一个相邻的对象 this.nextSibling(); 3.当前对象的上一个相邻的对象 this.previousSibl ...
- Spring MVC (二)
一.使用 @RequestMapping 映射请求 Spring MVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求 在控制器的类定义以及方法定义处都可以标注 类定义处:提 ...
- 两个list 合并后去除掉重复removeAll()的,然后再随机获取最后list中的 几个值
public static void test1(){ String s1="1,2,5,3,6,9"; String n1[]=s1.split(","); ...