首页 > 其他分享 >[TJOI2010] 天气预报 题解

[TJOI2010] 天气预报 题解

时间:2024-09-27 12:01:03浏览次数:1  
标签:dots right matrix int 题解 long TJOI2010 天气预报 vdots

分析一下题目,大致意思就是给定一组常数 \(a_i\),然后有一个递推式 \(w_i=\sum _{j=1}^{n} w_{i-j}\times a_{j}\),让你求出 \(w_m\) 对于 \(4147\) 取模的值。

根据这个 \(1\leq m\leq 10^7\) 的恐怖范围,姑且算到了 \(O(m)\) 的时间复杂度。但是观察一下这个递推式,发现 \(O(m)\) 跑不出来。于是乎我们自然就想到了使用矩阵快速幂优化。

我们先构造出初始矩阵:

\[st= \left( \begin{matrix} w_n & w_{n-1} & \dots & w_2 & w_1 \end{matrix} \right) \]

接着我们需要将其进行转移,得到新的 \(w_{n+1}\) 的值,最后使用快速幂求出 \(w_{m}\) 的值。那么很明显,对于这个转移矩阵的第一列肯定是从 \(w_n\) 到 \(w_{n+1}\) 的所有常数 \(a_i\),而后面的 \(n-1\) 项我们只需要直接赋值就可以了。整个式子差不多就是这个样子:

\[\left( \begin{matrix} w_{n+1} & w_{n} & \dots & w_3 & w_2 \end{matrix} \right) = \left( \begin{matrix} w_n & w_{n-1} & \dots & w_2 & w_1 \end{matrix} \right) \times \left( \begin{matrix} a_1 & 1 & 0 & \dots & 0 & 0 \\ a_2 & 0 & 1 & \dots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{n-2} & 0 & 0 & \dots & 1 & 0 \\ a_{n-1} & 0 & 0 & \dots & 0 & 1 \\ a_n & 0 & 0 & \dots & 0 & 0 \end{matrix} \right) \]

然后我们根据快速幂,把最后的矩阵直接算出来:

\[\left( \begin{matrix} w_m & w_{m-1} & \dots & w_{m-n+2} & w_{m-n+1} \end{matrix} \right) = \left( \begin{matrix} w_n & w_{n-1} & \dots & w_2 & w_1 \end{matrix} \right) \times \left( \begin{matrix} a_1 & 1 & 0 & \dots & 0 & 0 \\ a_2 & 0 & 1 & \dots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{n-2} & 0 & 0 & \dots & 1 & 0 \\ a_{n-1} & 0 & 0 & \dots & 0 & 1 \\ a_n & 0 & 0 & \dots & 0 & 0 \end{matrix} \right) ^{m-n+1} \]

这样我们取这个矩阵的 \(w_m\) 输出来就可以了。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=4147;
const int MAXN=105; 
int n,m;
int st[MAXN],a[MAXN];
int fr[MAXN][MAXN];
void mul(long long f[105],long long a[105][105])
{
    long long c[105];
    memset(c,0,sizeof(c));
    for(int j=0;j<n;j++)
    {
        for(int k=0;k<n;k++)    c[j]=(c[j]+(long long)f[k]*a[k][j])%MOD;
    }
    memcpy(f,c,sizeof(c));
}
void mulself(long long a[105][105])
{
    long long c[105][105];
    memset(c,0,sizeof(c));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            for(int k=0;k<n;k++)    c[i][j]=(c[i][j]+(long long)a[i][k]*a[k][j])%MOD;
        }
    }
    memcpy(a,c,sizeof(c));
}
signed main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)	cin>>st[n-i-1];
	for(int i=0;i<n;i++)	cin>>a[i];
	for(int i=1;i<n;i++)	fr[i][i-1]=1;
	for(int i=0;i<n;i++)	fr[i][n-1]=a[n-i-1];
	int sum=m-n;
	while(sum)
	{
		if(sum&1)	mul(st,fr);
		sum>>=1;
		mulself(fr);
	}
	cout<<st[n-1];
	return 0;
}

标签:dots,right,matrix,int,题解,long,TJOI2010,天气预报,vdots
From: https://www.cnblogs.com/SuporShoop/p/18435408

相关文章

  • ABC262G 题解
    LISwithStack观察到\(n\le50\),考虑区间dp。设\(dp(l,r,x,y)\)表示区间\([l,r]\)中选出的子序列的最小值\(\gex\),最大值\(\ley\)的方案数。根据栈的性质,设元素\(x\)入栈的时间为\(in_x\),出栈时间为\(out_x\),那么所有元素构成的区间\([in_x,out_x]\)两......
  • 2024-2025专题二题单 - 题解
    A-MoneyinHand(记忆化搜索)原题链接题解B-GoodGraph(并查集)原题链接题解C-IceSkating(dfs求连通块)原题链接题解D-TheLakes(dfs求连通块,连通块内累加,多组数据注意初始化)原题链接题解E-LearningLanguages(建图,dfs统计连通块个数,答案为个数-1)原题链接题......
  • 进击的奶牛题解
    题目描述FarmerJohn建造了一个有 N(2≤N≤105)个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x1,x2,⋯ ,xN​(0≤xi≤109)。他的 C(2≤C≤N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,FarmerJohn想把这些牛安置在指定的隔间,所......
  • 奶牛分厩题解
    题目描述农夫约翰有 N(1≤N≤5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号 s[i],所有的奶牛都睡在一个有 K 个厩的谷仓中,厩的编号为 00 到 K−1。每头奶牛都知道自己该睡在哪一个厩中,因为约翰教会了它们做除法,Si mod K的值就是第 i 头奶年所睡的厩的编......
  • 易优cms安全设置常见问题_Eyoucms安全设置问题解决方法
    易优EyouCMS的安全设置对于保护网站免受攻击非常重要。下面列出了一些关于易优CMS安全设置的常见问题及其解决方法:1.目录权限设置为了防止未经授权的访问,应该合理设置网站目录的权限。例如,上传目录通常需要写入权限,而其他目录则应限制权限以防止恶意文件上传或执行。解决方法......
  • 勇攀山丘小队(翻越篇)2——题解
    前言胸有丘壑,气吞山河。正片A题思路其实很简单,当你以当前位置在\(i\),油量为\(p\)的地方开到了位置为\(j\),且\(p_{j+1}-i>p\)时,你肯定走不了了。因此你应当在\(i\)到\(j\)找到能加油最多的加油站来进行加油。需要动态维护这个最大值的数据结构我们可以利用堆来实......
  • 题解 QOJ837 / ZROI1287【Giant Penguin】
    PetrozavodskWinter2020.Day3.300iqContest3.ProblemG.GiantPenguinGiantPenguin-Problem-QOJ.ac题目描述有一个\(n\)个点\(m\)条边的连通无向无权图,满足每个节点在至多\(k\)个简单环上(没有重复顶点的环是简单环)。\(q\)次操作支持:1.标记一个点;2.询问......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【哈希表】2024E-选修
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复......
  • java使用webservice 调用天气预报接口
    市场上有许多免费的和付费的天气预报API,例如OpenWeatherMap、WeatherAPI、Weatherstack等。这里我们以OpenWeatherMap为例,因为它提供了广泛的天气数据和相对简单的API接口。访问OpenWeatherMap的官网(https://openweathermap.org/) ,注册一个账户,并创建一个API密钥(APIkey)。这个密钥将......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......