hnu13150(hdu 4565)SO EASY!(矩阵快速幂)

2024-06-15 19:38

本文主要是介绍hnu13150(hdu 4565)SO EASY!(矩阵快速幂),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

So Easy!
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
Total submit users: 18, Accepted users: 8
Problem 13150 : No special judgement
Problem description

A sequence Sn is defined as:



Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example, ┌3.14┐=4. You are to calculate Sn. You, a top coder, say: So easy! 


Input

There are several test cases, each test case in one line contains four positive integers: a, b, n, m. Where 0< a, m < 215, (a-1)2< b < a2, 0 < b, n < 231.
The input will finish with the end of file.


Output

For each the case, output an integer Sn.


Sample Input
2 3 1 2013
2 3 2 2013
2 2 1 2013
Sample Output
4
14
4
Problem Source
HNU Contest 

原来博士出的SO EASY就是这个题。。。之前听过了但是没做过

之前做过一个类似的  所以一看到就知道是用矩阵快速幂做

但是这个多了一个取上界 第一直觉就是按之前的想法求值之后加一

照这个想法写了之后 跑了样例  一样。。。就交了  发现WA了

就意识到应该是那个上界的处理上出了问题


因为  ceil((a+sqrt(b))^n)=(a+sqrt(b))^n+(a-sqrt(b)^n)

令 a+sqrt(b)=x  a-sqrt(b)=y

(a+sqrt(b))^n+(a-sqrt(b)^n)=x^n+y^n=(x+y)(x^(n-1)+y^(n-1))-x*y(x^(n-2)+y^(n-2))

设 g(n)=x^n+y^n   x+y=2*a=p x*y=a*a-b=q

|g(n) g(n-1)|=|g(n-1) g(n-2)|* |p 1|

      |-q 0|

然后就可以由g(1) g(0) 2阶矩阵的n-1次幂求值

g(1)=2*a=p  g(0)=2

注意数据范围 所有的都要是__int64

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
//#define MOD 10009
#define MAXN 10010
#define INF 0x7fffffff
#define ll __int64
#define bug cout<<"here"<<endl;
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;ll mod,c,d;struct matrix
{ll a[2][2];
};matrix ori,res;void init()
{res.a[0][1]=res.a[1][0]=0;res.a[0][0]=res.a[1][1]=1;
}matrix multiply(matrix x,matrix y)
{matrix temp;memset(temp.a,0,sizeof(temp.a));for(int i=0;i<2;i++)for(int j=0;j<2;j++)for(int k=0;k<2;k++){temp.a[i][j]+=x.a[i][k]*y.a[k][j];temp.a[i][j]%=mod;}return temp;
}void calc(ll n)
{while(n){if(n&1)   res=multiply(ori,res);n>>=1;ori=multiply(ori,ori);}
}int main()
{
//    fread;ll n;while(scanf("%I64d%I64d%I64d%I64d",&c,&d,&n,&mod)!=EOF){init();ll x=2*c;ll y=c*c-d;ori.a[0][0]=x;ori.a[1][1]=0;ori.a[0][1]=1;ori.a[1][0]=-y;
//        ori.a[0][0]=ori.a[1][1]=c;
//        ori.a[0][1]=d;
//        ori.a[1][0]=1;calc(n-1);ll ans;ans=((x*res.a[0][0]+2*res.a[1][0])%mod+mod)%mod;//        double ans=0.0;
//        ll an=res.a[0][0]*c%mod+res.a[0][1]%mod;
//        an%=mod;
//        ll bn=res.a[1][0]*c%mod+res.a[1][1]%mod;
//        bn%=mod;
//        ans+=(double)1.0*res.a[0][0]*c%mod;
//        ans+=(double)1.0*res.a[0][1]%mod;
//        ans+=(double)(res.a[1][0]*c*1.0+1.0*res.a[1][1])*sqrt((double)5)%mod;
//        ans=ceil((double)((double)an+(double)bn*1.0*sqrt((double)d)));
//        printf("%llf\n",ans);
//        ans=(double)an+(double)bn*1.0*sqrt((double)d);
//        ll pp=(int)ans;
//        pp++;
//        pp%=mod;printf("%I64d\n",ans);}return 0;
}




这篇关于hnu13150(hdu 4565)SO EASY!(矩阵快速幂)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064393

相关文章

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及,智能家居行业正迎来新的发展机遇,众多厂商纷纷投身于 Matter 产品的研发与验证。然而,开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。  乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行业洞察力,推出了全面的 Matter 解决方案,包含基于乐鑫 SoC 的 Matter 硬件平台、基于开源 ESP-Matter SDK 的一

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

【Spring】Spring Boot 快速入门

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 小杨近些在学习人工智能方面的知识,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

Sublime Text 快速折叠CSS代码到一行

快速折叠CSS代码到一行 1.使用HTML/CSS/JS Prettify或者CSScomb美化代码 2.使用Alt+F3特征选取,删除下图中所有的特征空格 3.使用Ctrl+Shift+M选取括号里的内容,再使用一次Ctrl+Shift+M将大括号也一起选中。 4.使用Ctr+J折叠代码 5.Home键 6.Backspace键

一篇文章带你快速入门java

文章目录 一、一个简单的java代码1.1 Java程序的结构由三个不成组成:1.2 运行java程序1.3 JDK,JRE,JVM之间的关系?(面试题)1.4 标识符1.5 注释1.6 关键字 一、一个简单的java代码 public class HelloJava {public static void main(String[] args) {System.out.

汇编快速入门

一.基础知识 1.数据类型 DB(Define Byte,字节类型    占位8位bit == 1字节) 范围:DB可以用来定义(无符号、有符号)整数(包含二、十、十六进制)和字符 语法:a DB  数据个数  数据值 用法:a DB  -1 , 1 , 1000H , 'A' , "ABC" , ?(?是不知道的数值,一般机器自动使用0填充) DW(Define Word,字类型

(转)Sublime Text 2 (Emmet):HTML/CSS代码快速编写神器

Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生。它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示:   Zen coding下的编码演示   去年年底,该插件已经改名为Emmet。但Emmet不只改名,还带来了一些新特性。本文就来直观地演示给你。 一、快速编写HTML代码 1.

玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析

最近做一个项目时,需要在dataGird中插入<input>,即文本输入框,当点击提交时,需要把文本框里填的数据返以及其他列的一些信息以json数组的格式返回到后台,虽然我实现了该功能,但一直没找到简便的方法,今天终于在一位版主的点拨下找到了非常简单的方法。   var all = $("#dg").datagrid("getData");var json =JSON.