20180524模拟赛T3——Word

【题目描述】

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

  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;
}

原文地址:https://www.cnblogs.com/pfypfy/p/9084836.html

时间: 2024-08-29 12:17:13

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

20180520模拟赛T3——chess

[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\)的时候,马在原点.每个时刻马都跳一步. 可是这个坐标图有点残缺,有几个点是不能跳到的. 然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子. [输入格式] 从文件chess.in中读入数据. 第一行两个数K,n表示时间上限和残缺的点的数量. 接下来n行,每行一个坐标 xi,yi

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

体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时,面对海量的原始数据,如何对数据进行处理,得到同学们的体育总评成绩却又成了体育部老师的一大难题. 对于大一的同学们来说,体育课的总评成绩由五部分组成:体育课专项成绩(满分50分).长跑测试成绩(满分20分).“阳光长跑”成绩(满分10分).体质测试成绩(满分10分).“大一专项计划”成绩(满分10分)

[10.5模拟赛]T3

T3 Description 小\(Z\)是\(ZRP(Zombies' Republic of Poetry\),僵尸诗歌共和国\()\)的一名诗歌爱好者,最近他研究起了诗词音律的问题. 在过去,诗词是需要编成曲子唱出来的,比如下面这首<菩萨蛮>,唱出来的话其对应的音符就是这样的: 南园满地堆轻絮, 愁闻一霎清明雨 1 1 5 5 6 6 5 4 4 3 3 2 2 1 因而可以发现,"1 1 5 5 6 6 5 4 4 3 3 2 2 1" 这串音符就成为了研究音律的

字符串模拟赛T3

只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<stack> using namespace std; const int maxn = 1005; int n,m,ans;

[模拟赛] T3 最优序列

Description 给出一个长度为n(n<=1000)的正整数序列,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过k(k<=m<=10)个,并且选出的元素之和最大. Input 第一行三个数n,m,k. 第二行n个数,表示各元素数值大小. Output 一个数,表示最大元素和. Range 对于10%的数据,n<=10 对于30%的数据,n<=100 对于100%的数据,n<=1000, m从1到10随机(10的情况比较多) Solution 看范

[模拟赛] T3 Exploit

Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发) eXterminate(征服) --维基百科 今次我们着重考虑exploit部分,并将其模型简化: 你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球. 星球笼统的分为2类:资源型和维修型.(p为钻头当前能力值) 1.资源型:含矿物质量a[i],若选择开采

20180610模拟赛T3——书本整理

[问题描述] 小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱.小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和. 例如有4本书: 1×2 5×3 2×4 3×1 那么小明将其排列整齐后的顺序是: 1×2 2×4 3×1 5×3 凌乱值就是2+3+2=7. 于是小明决定拿掉其中的k本书,使凌乱值最小,你能帮他求出这个最小值吗?已知每本书的高度都不一样. [问题输入] 第一

树的dfs序,p1539,其他经典问题,2018/11/08模拟赛T3

树的dfs序指从根节点进行dfs(先序遍历),每次到达某个点的时间和离开这个点的时间.它可以将树上的问题转换成序列问题进行处理. 比如对于p1539的样例可以这样解释. 每个点的左边数字表示进入该点的"时间",右边的数字表示离开该点的"时间".对dfs序的介绍就到这里. 然后来看一个例题: 先读入边,跑一遍dfs确定dfs序. 对于操作1,把点x的进入的"时间"+=a,把x出去的"时间"-=a 这样操作3询问根节点到y的路径点

2019.10.18模拟赛T3

题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为了更好统计,把原式变为$n^2-\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)\leq n]$. 然后开始毒瘤... 首先,考虑枚举$lcm(i,j)$,设为$d$,计算有多少对$i.j$的最小公倍数为$d$. 设$i=p_1^{a_1}p_2^{a_2}\