【题目描述】

有一个星球要创造新的单词,单词有一些条件:

  1. 字母集有\(p\)个元音和\(q\)个辅音,单词由字母构成
  2. 每个单词最多有\(n\)个元音和\(n\)个辅音(同一元音或辅音可重复使用)
  3. 每个单词中元音总是出现在所有辅音之前,可以没有元音或没有辅音
  4. 每个单词至少有一个字母
  5. 可以在字母上标记重音。元音中最多标记一个,辅音中也最多标记一个,一个单词中最多标记两个字母为重音
  6. 如果两个单词字母、字母顺序或者重音不同就认为这两个单词不同。

他们想要知道一共能创造多少不同的单词,由于答案可能很大,所以只要输出答案mod M后的值。

【输入格式】

输入文件word.in包含4个正整数\(p,q,n,M\)

【输出格式】

输出文件word.out包含一个非负整数表示能创造出的新单词数 mod M 后的值。

【样例输入1】

1 1 1 9

【样例输出1】

8

【样例输入2】

2 3 2 1000

【样例输出2】

577

【样例输入3】

1 1 1000000000 1000000000

【样例输出3】

0

【数据规模】

对于 \(30\%\)的数据,\(p, q, n\le 7\)

对于\(60\%\)的数据,\(n \le 100000\)

对于\(100\%\)的数据,$ p, q, n, M ≤ 10^9$

题解

个人认为这题的题目描述可能会造成一点小小的误解。那就是“所有”的元音都应该放在辅音之前,即元辅音可以分开来看

那我们就只看元音吧。

于是我们就可以很自然地推出\(ans=\sum_{i=1}^n(i+1)p^i\)。由于有一个叫重音的东西,所以系数是\(i+1\)。直接算会T(70分),于是我们就想到了矩阵快速幂(orz严公分块、倍增)。

首先我们当然想到是推\(2\times 2\)的,于是写出初始矩阵\(\begin{bmatrix}0 & 2p \end{bmatrix}\),要转移到\(\begin{bmatrix}2p & 3p^2+2p\end{bmatrix}\)。发现矩阵的系数有变化,无法转移。于是我们就需要添加一格来辅助转移。观察两矩阵的系数变化,我们就不难推出辅助的那个应该填什么:\(\begin{bmatrix}0&p&2p\end{bmatrix}\to \begin{bmatrix}2p&p^2&3p^2+2p\end{bmatrix}\)。于是得出中间矩阵是\(\begin{bmatrix}1&0&0\\0&p&p\\1&0&p\end{bmatrix}\)话说个人这题的矩阵的推法挺精妙的,建议仔细回味一下)。

然后就用同样的方法算辅音即可。

代码

#include <cstring>
#include <cmath>
#include <fstream> using namespace std; typedef long long LL; ifstream fin("word.in");
ofstream fout("word.out"); LL chen[4][4], q, p, n, mod, jg[2][4], tt[4][4]; inline void pow(int aa)
{
while(aa)
{
if(aa & 1)
{
for(int j = 1; j <= 3; ++j)
{
tt[1][j] = 0;
for(int k = 1; k <= 3; ++k)
tt[1][j] = (tt[1][j] + jg[1][k] * chen[k][j] % mod) %mod;
}
memcpy(jg, tt, sizeof(jg));
}
aa >>= 1;
for(int i = 1; i <= 3; ++i)
for(int j = 1; j <= 3; ++j)
{
tt[i][j] = 0;
for(int k = 1; k <= 3; ++k)
tt[i][j] = (tt[i][j]+chen[i][k]*chen[k][j]%mod)%mod;
}
memcpy(chen, tt, sizeof(chen));
}
} int main()
{
fin >> q >> p >> n >> mod;
jg[1][1] = (q<<1) % mod;
jg[1][2] = q % mod;
chen[1][1] = chen[2][1] = chen[2][2] = q % mod;
chen[1][3] = chen[3][3] = 1;
pow(n);
LL sumy = jg[1][3];
memset(jg, 0, sizeof(jg));
memset(chen, 0, sizeof(chen));
jg[1][1] = (p<<1) % mod;
jg[1][2] = p%mod;
chen[1][1] = chen[2][1] = chen[2][2] = p % mod;
chen[1][3] = chen[3][3] = 1;
pow(n);
LL sumf = jg[1][3];
LL ans = (sumy*sumf%mod + sumy + sumf) % mod;
fout << ans;
return 0;
}

20180524模拟赛T3——Word的更多相关文章

  1. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  2. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  3. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

  4. ztz11的noip模拟赛T3:评分系统

    代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  5. 20180711模拟赛T3——聚变

    文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...

  6. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

  7. NOIP欢乐模拟赛 T3 解题报告

    3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...

  8. 字符串模拟赛T3

    只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring ...

  9. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

随机推荐

  1. centos7.2上安装CDH5.16.2及Spark2【原创】

    背景:我自己的电脑配置太低,想在centos操作系统上安装CDH5.1.2并配置集群,我去阿里云上买了3台按流量计费的阿里云服务器. 大家一定要注意,配置,购买的阿里云服务器不要太低了.建议:3台2核 ...

  2. TYPORA语法

    原文链接:https://blog.csdn.net/SIMBA1949/article/details/79001226

  3. 金九银十跳槽高峰,面试必备之 Redis + MongoDB 常问80道面试题

    前言 有着“金九银十”之称的招聘旺季已经开启,跳槽高峰期也如约而至. 本文为主要是 Redis + MongoDB 知识点的攻略,希望能帮助到大家. 内容较多,大家准备好耐心和瓜子矿泉水. Redis ...

  4. ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

    软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断.PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势. 一.PL 侧定时 ...

  5. .net core 2.0的认证和授权

    在asp.net core中,微软提供了基于认证(Authentication)和授权(Authorization)的方式,来实现权限管理的,本篇博文,介绍基于固定角色的权限管理和自定义角色权限管理, ...

  6. 『Blocks 区间dp』

    Blocks Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, ...

  7. Linux中历史命令

    历史命令,即之前登录session会话中的在命令行键入的命令. 在Linux中可以有两种方式查询历史命令 history命令 当前用户目录中的隐藏文件.bash_history 一.history 作 ...

  8. 开发dubbo应用程序(二)dubbo注册中心相关概述

    1.注册中心概述 ​ 在Dubbo微服务体系中,注册中心是其核心组件之一.Dubbo通过注册中心实现了分布式环境中各微服务之间的注册与发现,是各分布式节点之间的纽带.其主要作用如下: 动态加入.一个服 ...

  9. gcc 编译过程

    gcc 编译过程从 hello.c 到 hello(或 a.out)文件, 必须历经 hello.i. hello.s. hello.o,最后才得到 hello(或a.out)文件,分别对应着预处理. ...

  10. 2019 找钢网java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.找钢网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了找钢网,入职一年时间了,也成为了面试官 ...