codevs4247 奇特的生物

4247 奇特的生物

题目描述 Description

科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限。已知年龄为1 岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具有生育能力的个体将长大一岁时会生下ai个1岁的幼崽。假设第一天只有一个年龄为1的幼 崽,现在科学家们想知道第x天年龄为y的个体有多少,但由于该物种增长速度太快,于是他们将这个任务交给了你。由于这个数可能很大,你需要对p取模。

输入描述 Input Description

输入数据第一行给定四个整数k,x,y,p。

第二行包括k个整数,第i个整数代表ai。

输出描述 Output Description

输出数据包含一行,表示第x天年龄为y的个体的数量对p取模后的结果。

样例输入 Sample Input

【样例输入 1】

3 3 1 1007

1 1 1

【样例输入 2】

3 6 2 1007

1 2 1

样例输出 Sample Output

【样例输出1】

2

【样例输出 2】

13

数据范围及提示 Data Size & Hint

【思路】

矩阵乘法。

可以总结出题目所述的转换规则如下:

|F1,F2,F3…Fk| => |a1*F1+a2*F2+…ak*Fk , F1,F2,…Fk-1|

原矩阵A:

|1,0,0,…0|

转换矩阵T:

|a1,1,0,0…|

|a2,0,1,0…|

|.. , ..,..1…|

|ak,0,0 0…|

分类讨论(标号从0开始):

如果y>x 转移不到数目为0

否则

如果y<=k A=A*(T^(x-1))输出A[0][y-1]

否则

A=A*(T^(x-y+k)) 输出A[0][k-1]

(注意到只要是年龄比k大数目就不会发生变化,所以只要把y所对应的计算到k-1即可)

又:其实只要是1岁以后数目都不会发生变化,上述麻烦了。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4
 5 typedef long long LL;
 6 const int maxn = 30+5;
 7 LL k,x,y,m;
 8 LL a[maxn];
 9
10 LL multi( LL y , LL cnt ) {
11     if ( ! cnt ) return 0 ;
12     if ( cnt == 1 ) return y % m ;
13     LL rec = multi( y , cnt / 2 ) ;
14     rec = ( rec + rec ) % m ;
15     if ( cnt % 2 ) rec = ( rec + y ) % m ;
16     return rec ;
17 }
18 struct Matrix{
19     int r,c;
20     LL N[maxn][maxn];
21     void init(int r,int c) {
22         this->r=r, this->c=c;
23         memset(N,0,sizeof(N));
24     }
25     Matrix operator*(Matrix& B)const{
26         Matrix C;
27         C.init(r,B.c);
28         for(int i=0;i<C.r;i++)
29            for(int j=0;j<C.c;j++)
30            {
31               for(int k=0;k<c;k++) C.N[i][j] += multi(N[i][k],B.N[k][j]);
32               C.N[i][j]%=m;
33           }
34         return C;
35     }
36     Matrix pow(LL p) {
37         Matrix tmp=*this;
38         Matrix ans;
39         ans.init(r,r);
40         for(int i=0;i<r;i++) ans.N[i][i]=1;
41         while(p) {
42             if(p&1) ans=ans*tmp;
43             tmp=tmp*tmp;
44             p>>=1;
45         }
46         return ans;
47     }
48 }A,T;
49
50 int main() {
51     scanf("%lld%lld%lld%lld",&k,&x,&y,&m);
52     for(int i=0;i<k;i++) scanf("%lld",&a[i]);
53     if(y>x) {
54         printf("0");
55         return 0;
56     }
57     A.init(1,k);
58     A.N[0][0]=1;
59     T.init(k,k);
60     for(int i=0;i<k;i++) T.N[i][0]=a[i];
61     for(int i=1;i<k;i++) T.N[i-1][i]=1;
62     if(y<=k)
63     {
64         T=T.pow(x-1);
65         A=A*T;
66         printf("%lld ",A.N[0][y-1]);
67     }else {
68         x=x-y+k;
69         T=T.pow(x-1);
70         A=A*T;
71         printf("%lld",A.N[0][k-1]);
72     }
73     return 0;
74 }
时间: 2024-08-15 14:12:57

codevs4247 奇特的生物的相关文章

codevs4247奇特的生物 解析报告

4247 奇特的生物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具有生育能力的个体将长大一岁时会生下ai个1岁的幼崽.假设第一天只有一个年龄为1的幼崽,现在科学家们想知道第x天年龄为y的个体有多少,但由于该物种增长速度太快,于是他们将这个任务交给了你

奇特的生物

题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具有生育能力的个体将长大一岁时会生下ai个1岁的幼崽.假设第一天只有一个年龄为1的幼崽,现在科学家们想知道第x天年龄为y的个体有多少,但由于该物种增长速度太快,于是他们将这个任务交给了你.由于这个数可能很大,你需要对p取模. 输入描述 Input Description 输入数据第一行给定四个整数k,

CodeVS第四次月赛解题报告

1.   奶牛的身高 题目描述 Description 奶牛们在FJ的养育下茁壮成长.这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的身高,由于Bessie是只奶牛,无法直接看出第i只奶牛的身高,而只能看出第i只奶牛与第j只奶牛的身高差,其中第i只奶牛与第j只奶牛的身高差为Ai(i<=n).当A大于0时表示这只奶牛比前一只奶牛高A cm,小于0时则是低.现在,FJ让Bessie总共去看了m次身高,当然也就传回给FJ m对奶牛的身高差,但是Bessie毕竟是奶牛,有时候眼睛可

XCOM2中敌对生物设计分析(Aliens篇)

Aliens Aliens作为游戏设定中入侵的外星人,有各式外貌及奇特的战斗方式,掌握一些高能科技或利用精神力量进行攻击 Sectoid 使用灵能战斗的外星人,并无高级版本,初级便会使用精神控制,生命值较少. 能力:精神控制 召唤僵尸 眩晕目标(闪光弹效果,移动力.命中率大幅降低,无法使用部分能力) 恐慌目标 AI行为模式及策略:防御型 1.选择离玩家单位一定距离的掩体躲避 2.优先使用灵能(召唤僵尸优先级最大) 3.极少使用主武器 设计分析: Aliens中最基础的,定位偏向于“杂兵”的单位,

专访Facebook HipHop作者/阿里研究员赵海平:生物与计算机交织的独特人生

3 月 26 日,杭州的天阴沉沉,这是一种山色空蒙雨亦奇的美丽,还是雾霭笼罩下的怪异,对于来访阿里巴巴西溪园区的人们来说,没人关心这些.人们行色匆匆,兴奋地往各自目的地奔赴而去.我也来不及细思这些,因为今天要和刚从 Facebook 来到阿里的赵海平聊天. 就语言之争,赵海平称,有人会去争论锤子和斧子哪更好使吗?它不是要根据你做的事来定吗? 赵海平是非常著名的软件工程师,曾在微软工作过.2007 年加入不到 50 位软件工程师的 Facebook(是第一位中国工程师),期间他创建了 HipHop

生物总结

生物 作为蒟蒻,我的生物遇到了很大的问题.因为新升入高中,并不适应高中的学习方法.我自己初中养成的习惯就不好,比较懒.平常不喜欢记笔记,也不喜欢总结,只是靠着自己的小聪明,还自己也个人洋洋得意.这几天发现高中学习并不是这样的,生物虽然是理科,但是非常需要归纳与总结.虽然生物课本只讲了两节课,但是知识内容并不少.今天写题的时候发现很多东西并不会了,原因就是对知识的掌握不够,对理论的理解并不透彻,对公式的运用并不熟练.那么,我该怎么做呢?仔细思考了下,我应该按照语文老师的建议,不论是哪科,至少一周一

读《奇特的一生》后的一些感悟

一年前写的,送给现在的自己. 三个月前一个很偶然的机会我发现了<奇特的一生>这本书,那会儿正是我毕业为止过的最艰难的一段日子,每天早出晚归,就像个机器一样工作,没有什么具体的思想,仅仅是为了谋生,向人吐露的一些想法都是抱怨. 第一次翻开这本书的时候也没抱什么希望,因为我不觉得一本书能彻底拯救一个人,其实到现在也没算拯救我,只是让人的心态发生了变化,读完了之后我当 天就模仿柳比歇夫给自己弄了个日记本,我尝试着用书中主人公的方式记录每天的生活,每个周六的晚上会给自己这周做个比较粗略的总结,同时定下

生物醫學大數據:現狀與展望

大數據 (big data) 是指由於容量太大和過於複雜,無法在一定時間內用常規軟體對其內容進行抓取.管理.存儲.檢索.共享.傳輸和分析的數據集. 大數據具有「4V」特徵:①數據容量 (Volume) 大,常常在 PB(1 PB=250 B)級以上:②數據種類 (Variety) 多,常常具有不同的數據類型(結構化.半結構化和非結構化)和數據來源:③產生和更新速度 (Velocity) 快(如實時數據流),時效性要求高:④科學價值 (Value) 大,儘管利用密度低,卻常常蘊藏著新知識或具有重要

生物医药企业

目录: (1)Pfizer辉瑞 (2)葛兰素史克(GSK) (3)novo nordisk诺和诺德 (4)Kaiser Permanente(5)genentech (6)memorial sloan kettering caner center (7)Harvard medical school哈佛医学院 (8)(Brigham and Women's Hospital,BWH)布莱根妇女医院 (9)Arrowhead Research Corporation (1)Pfizer辉瑞 美国,制