noip模拟赛 蒜头君的兔子
2024-08-30 06:26:48
分析:直接暴力算有30分,像斐波那契那样推式子算有60分,如果想要得到100分就要用一种数列题的常见优化--矩阵了.
当前的兔子数和十年内的兔子数有关,我们需要1个1*11的矩阵,来记录当前为0岁、1岁、2岁......兔子的数量,同时还需要一个快速幂矩阵进行计算.由于一年后a[1] = a[0],a[2] = a[1],......,a[10] = a[9],a[0] = a[1] + a[2] + a[3] + ...... + a[10],很容易构造出矩阵来.
因为矩阵比较复杂,还是推荐用结构体来写.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int mod = ;
int t;
long long print,sum; struct node
{
int n, m;
long long a[][];
node()
{
memset(a, , sizeof(a));
n = ;
m = ;
}
}s,p,ans; node mul(node a, node b)
{
node c;
c.n = a.n;
c.m = b.m;
for (int i = ; i < a.n; i++)
for (int j = ; j < b.m; j++)
for (int k = ; k < a.m; k++)
{
c.a[i][j] += (a.a[i][k] * b.a[k][j]) % mod;
c.a[i][j] %= mod;
}
return c;
} node qpow(node a, int b)
{
node t;
t.n = ;
t.m = ;
for (int i = ; i < ; i++)
t.a[i][i] = ;
while (b)
{
if (b & )
t = mul(t, a);
a = mul(a, a);
b >>= ;
}
return t;
} int main()
{
scanf("%d", &t);
s.n = ;
s.m = ;
s.a[][] = ;
p.n = ;
p.m = ;
for (int i = ; i <= ; i++)
{
p.a[i][] = ;
p.a[i - ][i] = ;
}
p.a[][] = ;
ans = mul(s, qpow(p, t - ));
for (int i = ; i <= ; i++)
sum = (sum + ans.a[][i]) % mod;
printf("%lld\n", sum); return ;
}
最新文章
- thinkphp传递参数
- JS对Array进行自定制排序
- WampServer Version 2.5 bug修改
- design the relations
- uvision4 ide已停止工作
- 南阳理工ACM-OJ 分数加减法 最大公约数的使用
- HTML&;CSS基础学习笔记1.16-单元格间距和表格主体
- document.write 存在几个问题?应该注意
- Java IO 学习总结 学习手册总结
- FPGA基础知识了解
- SharedPreferences解析
- CentOS 7 系统的初化始配置
- mysql替换字符串
- extern字符串常量,宏定义字符串常量,怎么选
- canvas与svg特性和使用对比
- 获取URL中的链接(可中文也可英文)
- some ideas
- Python之——遇到的小知识点总结
- J02-Java IO流总结二 《概述》
- 如何在不改SQL的情况下优化数据库