
小D的剧场
发布日期:2021-05-07 06:55:37
浏览次数:15
分类:精选文章
本文共 2477 字,大约阅读时间需要 8 分钟。
链接:https://ac.nowcoder.com/acm/contest/369/A
来源:牛客网小D的剧场
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 若你摘得小的星星 你将得到小的幸福 若你摘得大的星星 你将得到大的财富 若两者都能摘得 你将得到永远的愿望 摘星是罪孽的宽恕 摘星是夜晚的奇迹 抓住它吧 你所期望的那颗星无法触及,因而耀眼
明明触及了,却还是耀眼 ——《少女☆歌剧 Revue·Starlight》题目描述
“我明白。”
作为这命运剧场永远的观众,小D一直注视着这片星光璀璨的舞台,舞台上,少女们的身姿演绎出了一幕幕动人的场景,令人回味无穷。 有的时候,小D也会自己写一些歌曲,来加入Starlight的剧本,使得剧本充满了新的生命力。 现在小D又要准备写乐谱了,小D写谱的方式比较独特。他会先写出一个按照音符出现顺序排成的序列,再进一步整合,每次整合会选取相邻的三个作为三和弦。整合次数无限。 小D选取的音符形如D5 F6这种形式,例如D5表示D大调sol(这里不考虑升降音)为了方便生成乐谱,他将这些音符进一步转化了,小D给C D E F G A B重新编号成了1 2 3 4 5 6 7,之后新的音符编号生成方式应为(字母对应的标号-1)*7+数字,例如C7=(1-1)\times7+7=7C7=(1−1)×7+7=7 但小D讨厌一些他所认为的不优美的和弦,因此他并不希望自己的谱子里面有可能出现这样的三和弦,也就说音符组成的序列里不应该存在他所讨厌的子段,假如C5 F1 A2这三个音符凑成的和弦小D不喜欢,那么序列里面就不能出现C5 F1 A2,C5 A2 F1,A2 C5 F1,A2 F1 C5,F1 A2 C5,F1 C5 A2这六种子段。 现在小D正在推算有多少合法的序列,答案对 10^9+710 9 +7 取模。 星屑飘洒的舞台上,可人绽放的爱之花,请努力让大家星光闪耀吧! 输入描述: 第一行为两个整数 n, q ,表示序列的长度和有多少和弦小D不喜欢. 接下来 q 行,每行三个整数 a, b, c ,表示小D不想出现的和弦 输出描述: 一行一个整数,表示答案 示例1 输入 复制 10 10 18 3 3 43 28 22 42 28 3 48 48 4 29 9 31 47 9 22 1 22 49 15 48 29 2 8 27 4 24 34 输出 复制 382785822 示例2 输入 复制 3 1 1 2 3 输出 复制 117643 说明 一共有6种不合法的序列: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 答案为49^3-6=11764349 3 −6=117643 备注: 3 \leq n \leq 500, 0 \leq q \leq 117649,1 \leq a,b,c \leq 493≤n≤500,0≤q≤117649,1≤a,b,c≤49/*题意是n个位置可放字符其中的合法数有多少种,每一个位置可以放49种字符,如果连续三个位置存在不合法的字符,那么该种组合不合法。那么连续的三个字符不合法就好弄了。首先定义dp[i][j][k],表示第i个位置放j,第i-1个位置放k,那么想要其合法,第i-2个位置就不能是l,也就是说,如果存在限制vis[j][k][l],那么它的方案数就不能加上dp[i-1][k][l],否则就可以加上。所以转移方程就是if(!vis[j][k][l]){dp[i][j][k]+=dp[i-1][k][l];}那么我们就枚举i个位置和i-1个位置的所有情况1<=j<=49;1<=k<=49;同样的对与第三个数能不能加上就看有没有限制。1<=l<=49;那么最后的答案就是dp[n][i][j],对应其所有的组合情况。初始化dp[2][i][j]=1;表示2个位置就两种情况,dp[2][1][2]=1;dp[2][2][1]=1;为了不重复统计。*/#include#include int dp[500][50][50];//dp[i][j][k]表示第i位选择j,第i-1位选择k的方案数int vis[50][50][50];using namespace std;const int p=1e9+7;typedef long long ll;int main(){ int n,q; cin>>n>>q; while(q--) { int a,b,c; cin>>a>>b>>c; vis[a][b][c]=vis[a][c][b]=vis[b][a][c]=vis[b][c][a]=vis[c][b][a]=vis[c][a][b]=1; } for(int i=1;i<=49;i++) for(int j=1;j<=49;j++) { dp[2][i][j]=1; } for(int i=3;i<=n;i++) for(int j=1;j<=49;j++) for(int k=1;k<=49;k++) for(int l=1;l<=49;l++) { if(!vis[j][k][l]) { dp[i][j][k]+=dp[i-1][k][l]; dp[i][j][k]%=p; } } int ans=0; for(int i=1;i<=49;i++) for(int j=1;j<=49;j++) { ans+=dp[n][i][j]; ans%=p; } cout< <
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月21日 10时34分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SLAM学习笔记-求解视觉SLAM问题
2019-03-05
普歌-允异团队-HashMap面试题
2019-03-05
还在一个一个手动安装虚拟机吗?Cobbler自动部署装机一键最小化安装打把游戏就好了
2019-03-05
程序员应该知道的97件事
2019-03-05
create-react-app路由的实现原理
2019-03-05
Linux环境变量配置错误导致命令不能使用(杂谈)
2019-03-05
openstack安装(九)网络服务的安装--控制节点
2019-03-05
shell编程(六)语言编码规范之(变量)
2019-03-05
vim杂谈(三)之配色方案
2019-03-05
vimscript学习笔记(二)预备知识
2019-03-05
Android数据库
2019-03-05
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2019-03-05
keil左侧文件调整方法
2019-03-05
STM8 GPIO模式
2019-03-05
omnet++
2019-03-05
23种设计模式一:单例模式
2019-03-05
Qt中的析构函数
2019-03-05
C语言实现dijkstra(adjacence matrix)
2019-03-05
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
2019-03-05