2019 10.3模拟

1. 蒜头君的兔子

(rabbit.cpp/.in/.out 2s,256m)
蒜头君的小伙伴在 第一年 送给他一对 一岁 的兔子,并告诉他:这种兔子 刚生下来时算 0 岁
,到了 2 岁时就可以繁殖了,它在 2-10 岁时,每年会生下来一对兔子,这些兔子到了 2 岁也可
以繁殖,但这些兔子在 10 岁那年 生完仔后 不久就会死亡,蒜头君想知道,第 n 年兔
子 产仔之后(第 n 年 10 岁的兔子此时已经死亡),他会有多少对兔子。结果对
1000000007 取模。
输入格式
共一行,一个正整数 n,表示蒜头君想知道第 n 年的兔子总对。
输出格式
输出一个整数,表示第 n 年兔子总对数对 1000000007 取模的值。
数据规模
对于 30% 的数据,满足 1≤n≤103;
对于 60% 的数据,满足 1≤n≤105;
对于 100% 的数据,满足 1≤n≤109。
样例输入1

10
样例输出1

88
样例输入2

88
样例输出2

352138150
样例输入3

10086
样例输出3
405567313

考点:递推 矩阵乘法
设 f[i][j]表示第 i 年,年龄为 j 的兔子的对数。
f[i][0]=f[i-1][1]+f[i-1][2]+...+f[i-1][9]
f[i][1]=f[i-1][0]
f[i][2]=f[i-1][1]
f[i][3]=f[i-1][2]
......
f[i][9]=f[i-1][8]
f[i][10]=f[i-1][9] //已经死掉
构造初始矩阵
{ f[i][0],f[i][1],f[i][2],...,f[i][9] }*矩阵 A={ f[i+1][0],f[i+1][1],f[i+1][2],f[i+1][3],...,f[i+1][9]}
矩阵 A
0 1 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 0 0 0 1 0 0 0 0 0
1 0 0 0 0 1 0 0 0 0
1 0 0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0
矩阵乘法即可

(感谢黄学长讲解)

#include<bits/stdc++.h>
using namespace std;long long f[12][12],c[12][12];
void cheng(long long a[12][12],long long b[12][12])//矩阵y乘x,结果存在y中
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=10;i++)
    for(int k=1;k<=10;k++)
    for(int j=1;j<=10;j++)
    c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%1000000007)%1000000007;
    memcpy(a,c,sizeof(c));
}
long long ans[12][12];
void prepare(int b)//二分快速幂求A^(n-1)
{
    for(int i=1;i<=10;i++)ans[i][i]=1;
    while(b)
    {
        if(b&1)cheng(ans,f);
        b>>=1;
        cheng(f,f);
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=2;i<=10;i++)f[i][1]=1;
    for(int i=2;i<=10;i++)f[i-1][i]=1;
    prepare(n-1);
    int sum=0;
    for(int i=1;i<=10;i++)sum=(sum+ans[2][i])%1000000007;//一开始只有一对一岁的兔子
    cout<<sum%1000000007;
}

2. 蒜头君的排序

(sort.cpp/.in/.out 2s,256m)
蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过
冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺激的,给定一个 1…
n 的排列,每次从该排列中选择一个区间 [l,r],问使用冒泡排序将该区间排至升序需要多少次交换
操作。
输入格式
第一行一个整数 n,表示排列长度。
接下来一行 n 个整数,表示该排列。
接下来一行一个整数 m,表示询问次数。
接下来 m 行,每行 2 个整数 l,r,表示询问 [l,r] 区间。
输出格式
输出 m 行,每行 1 个整数,第 i 行表示第 i 个询问的答案。
数据规模
对于 30% 的数据,满足 1 ≤ n,m ≤ 300;
对于 60% 的数据,满足 1 ≤ n,m ≤ 1000;
对于 100% 的数据, 满足 1 ≤ n,m ≤ 30000, l < r, ∑∣l[i] - l[i - 1]∣ + ∑∣r[i]- r[i - 1]∣ ≤ 7 × 106。
样例输入

10
9 8 7 4 5 6 10 3 2 1
5 2
4
8 10
2 8
5 9
4 9
样例输出
3

3

13

7

9

考点:逆序对 莫队思想
如果已经求出区间 [l,r]的逆序对数,那么我们可以用类似莫队的思想快速求出 [l-
1,r],[l+1,r],[l,r+1],[l,r-1]的逆序对
如果知道区间[l , r]中的逆序对个数,那么也可以快速求出区间[l-1 , r], [l+1 , r], [l , r-1], [l ,
r+1]的逆序对个数。
③ [l-1 , r]的个数 = [l , r]的个数 + [l , r]中比 a[l-1]小的元素的个数
① [l+1 , r]的个数 = [l , r]的个数 - [l+1 , r]中比 a[l]小的元素的个数
② [l , r-1]的个数 = [l , r]的个数 - [l , r-1]中比 a[r]大的元素的个数
① [l , r+1]的个数 = [l , r]的个数 + [l , r]中比 a[r+1]大的元素的个数
Lt,Rt 表示处理完当前询问后,讨论指针所指向的区间边界。
那么对于新的一个询问[x,y]
1.Rt<y
while(Rt<y)
Rt++;
ans+=getSum(n)-getSum(A[Rt]-1)//统计之前出现过的,比 A[Rt]要大的数字的个数,即
A[Rt]贡献的逆序对数。
modify(Rt,1) //将 A[Rt]加入树状数组

2.Rt>y
while(Rt>y)
modify(A[Rt],-1) //在添加 A[Rt]进入树状数组之前, [Rt,n]之间的数都与
A[Rt]构成逆序对
ans-=getSum(n)-getSum(A[Rt]-1)//将 A[Rt]贡献的逆序对从答案中减掉
Rt--

3.Lt<x
while(Lt<x)
modify(A[Lt],-1) //在添加 A[Lt]进入树状数组前, [1,Lt]区间的数字都比 A[Lt]
要小,它们都与后加入的 A[Lt]构成逆序对。
ans-=getSum(A[Lt]-1)
Lt++

4.Lt>x

while(Lt>x) Lt-- //在区间[1,Lt-1]的数字,都与 A[Lt]构成逆序对。即之前出现过的比 A[Lt]小的数字

ans+=getSum(A[Lt]-1)
modify(A[Lt],1)

3. 蒜头君救人

(rescue.cpp/.in/.out 2s,512m)
蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛
上,于是蒜头君决定去背他们离开困境,假设蒜头君所在的村子是 n × m 的网格,网格中.
号代表平地, #号代表该地已被洪水淹没, A、 B ……等大写字母表示该地有村民被困, s 代表
蒜头君的起点, t 代表蒜头君的终点。
蒜头君的初始速度为 k 秒一格,他每次可以向上下左右 4 个方向中的一个移动 1 格。在背上
一个村民后,他的速度可能会降低,也可能会加快,但他的速度不能快于 1 秒每格,那么蒜头君
想知道,他最快需要多长时间将所有村民救出?
注意:不能在终点以外的地方放下村民;可以同时背多个村民。

输入格式
第一行 3 个正整数 n,m,k,分别表示村庄长度、宽度、蒜头君初始速度。
接下来 n 行,每行一个长度为 m 的字符串,表示村庄的地形,字符串意义如上所述。
接下来若干行,每行一个大写字母、一个整数,表示该编号的村民会使 k 增加 / 减少多少。行数等
同于地形中大写字母的个数。大写字母按字典序,即 A、 B、 C 的顺序排列,保证前后两行的字母是
连续的。

输出格式
输出 1 个整数,表示最小用时。

数据规模
对于 10% 的数据,满足 1 ≤ n,m ≤ 5,村民个数为 1;
对于 50% 的数据,满足 1 ≤ n,m ≤ 5,村民个数小于等于 5;
对于 100% 的数据,满足 1 ≤ n,m ≤ 10,村民个数小于等于 10。
样例输入

4 4 2
s.##
..A#
.B##
...t
A -3
B 4
样例输出
17

考点:状压 DP floyd
状态 f[S1][S2][p]表示背着的村民集合 S1,已到终点的村民集合 S2,蒜头君处在 p 位置(p 只
取初始状态下村民的位置、终点位置),那么显然有状态转移:
接村民:f[s1|(1<<y-1)][S2][y] = min{ dis(x,y)*v[s1]+f[s1][s2][x]}
(x∉S2,x∈S1,y∉S2,y∉S1)
终点处放下村民:f[s1^T][S2|T][end]=min(f[S1^T][S2|T][end],f[S1][S2][end])
(T 为子集,T∈S1,end 为终点)
因为在这样的定义下,S1 与 S2 是不能有交集的,这样显然不可能的情况在循环里判断一下
就可以了,实际上可能合法的情况只有 3^cnt 种。
再加上 x,y 与两个集合间的关系,循环执行的次数不会特别多

原文地址:https://www.cnblogs.com/CXYscxy/p/11620016.html

时间: 2024-10-13 08:16:02

2019 10.3模拟的相关文章

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

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

2019.10.26模拟赛

T1 序列 给定一长度为\(n\)的序列\(s\),定义其健美值为:\[\sum\limits_{i=1}^{n}|s_i - i|\]因为 zzq 喜欢健美,所以 zzq 希望减小\(s\)的健美值,以衬托 zzq 的健美.为了达到 zzq 的目的,zzq 希望你对序列进行旋转操作,一次旋转操作可以使序列中的所有元素前移一位,并使\(s_1\)移动到\(s_n\). 可以进行任意次旋转操作,zzq 希望旋转后的健美值最小,请找出这个最小值. SOV 智商检测题 我们发现对于每个数,移动每一次会

2019.10.22模拟赛

T1 合并集合 有\(n\)个集合,第\(i\)个集合记为\(S_i\),集合按环状排列,即第\(i + 1\)个集合右边是第\(i\)个集合,第\(n\)个集合右边是第\(i\)个集合. 一开始每个集合里只有一个数,每次你可以选择两个相邻的集合\(S,T\),然后合并成\(S \cup T\),之后你可以获得收益\(|S| \times |T|\),其中\(|S|\)表示集合\(S\)的元素个数. 你需要一直进行以上的操作直到只剩一个集合为止,求能获得的最大的收益之和. 断环为链,复制两倍区间

2019.10.24模拟赛

T1 古代龙人的谜题 Mark Douglas 是一名调查员.他接受了「调查古代龙人」的任务.经过千辛万苦,Mark 终于找到了一位古代龙人.Mark 找到他时,他正在摆弄一些秘药,其中一些药丸由于是从很久以前流传下来的,发出了独特的光泽.古代龙人告诉了 Mark 一些他想知道的事情,看了看手中的秘药,决定考一考这位来访者. 古代龙人手中共有\(n\)粒秘药,我们可以用\(1\)表示「古老的秘药」,其余的用\(0\)表示.他将它们排成一列.古代龙人认为平衡是美的,于是他问 Mark 能选出多少个

2019.10.31模拟赛

说在前面 考场遇见原题??? 上午刚做的 下午就\(T3\)考到了\(2333\) 然而还是因为忘了取模挂了28分 T1 Dove下跳棋 数据太水输出n-1可得90 Dove 喜爱下跳棋,在传统的跳棋基础之上,Dove 又延伸出了许多别的玩法.Dove 以一个一维数轴为棋盘下跳棋,总共会移动棋子?? ? 1 次.因为讨厌没有规律,所以Dove 每次只会恰好把棋子向右移动?? 个格子. Cicada 送给了Dove 一个长度为?? 的数列{??},为了表示感谢,Dove 打算以Cicada 送给他

赣南师范学院数学竞赛培训第10套模拟试卷参考解答

1. 设 $f,g$ 是某数域上的多项式, $m(x)$ 是它们的首一最小公倍式, 而 $\scrA$ 为该数域上某线性空间 $V$ 的一个线性变换. 试证: $$\bex \ker f(\scrA)+\ker g(\scrA)=\ker m(\scrA). \eex$$ 证明: 先证: $\ker f(\sigma)+\ker g(\sigma)\subset\ker m(\sigma).$ 由 $f|m$, $g|m$ 知 $\ker f(\sigma)\subset \ker m(\sig

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

2019.10.19初赛滚粗后的日子

写在故事的前面的话 人生中第一次考CSP-S,然后考得有点自闭,我想我写这篇blog并不是想要说AFO之类的话,相反,我觉得自己应该继续坚持下去的丫子.自己以前欠了很多知识,以前是自己初中时期的不认真,现在我就把自己当成是高一才学OI的萌新,忘记过去对自己的一些期望,重新开始自己的OI生涯. 2019.10.19 今天在自闭完了之后还是逐渐接受了初赛没有多大几率过的事实,开始复习起之前学的东西.首先,今天开始复习树形DP(入门).list如下: Park visit (已过) 没有上司的舞会 (