HDU4565 So Easy!
/*
HDU4565 So Easy!
http://acm.hdu.edu.cn/showproblem.php?pid=4565
数论 快速幂 矩阵快速幂
题意:求[(a+sqrt(b))^n ]%m [ ]代表向上取证
联想到斐波那契数列,所以第一感觉是矩阵快速幂
后来发现根本不用这么麻烦,我们认为a+b*sqrt(c)中的a为实部
b为虚部,就能直接用二元乘法模拟矩阵快速幂了,因此这两种方法
是等价的。于是乎,我们就解决了精度问题。
然而即使我们得出了结果中的a+b*sqrt(c)也不能这么算
因为[b*sqrt(c)]%m不和[b%m*sqrt(c)]%m同余,因此只能另辟蹊径。
注意到题目中的(a-1)^2< b < a^2 <=> 0<a-sqrt(b)<1
所以 0<(a+sqrt(b))^n<1 而 (a+sqrt(b))^n与(a-sqrt(b))^n是公轭的
所以其和只剩下了实部的二倍。因此只需求出实部,将其乘以2就是答案。
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>
#include <map>
#include <set>
#define test
using namespace std;
const int Nmax=;
//const long long mod=2147483647LL;
//double eps=1e-8;
long long a,b,n,m;
struct Num
{
long long a;
long long b;
long long c;
Num(long long _a,long long _b,long long _c)
{
a=_a;
b=_b;
c=_c;
}
friend Num operator * (Num x,Num y)
{
long long a1=x.a%m,b1=x.b%m,a2=y.a%m,b2=y.b%m,c=x.c;
long long a=(a1*a2%m+((c*b1*b2)%m))%m;
long long b=((a1*b2)%m+((b1*a2)%m))%m;
return Num(a,b,c);
}
friend Num qpow(Num base,long long n)
{
Num ans(1LL,0LL,base.c);
//ans.print();
while(n>0LL)
{
if(n&1LL)
ans=ans*base;
base=base*base;
n>>=;
//ans.print();
}
//printf("%lld %lld %lld\n",ans.a,ans.b,ans.c);
return ans;
}
void print()
{
printf("a:%lld b:%lld c:%lld\n",a,b,c);
}
}; void work()
{
Num base(a,1LL,b);
Num ans=qpow(base,n);
//ans.print();
long long a=ans.a,b=ans.b,c=ans.c;
//long long res=(long long)ceil(a+b*sqrt(c));//不能这么写,因为整数和小数直接不能模
//while(a<=0)
//a+=m;
//while(b<=0)
//b+=m;
//ans.print();
//long long res=(long long)ceil(a+b*sqrt(c));
//printf("res:%lld\n",res);
//res=res%m;
//printf("%lld %lld %ll\n",a,b);
//ans.print();
//if(2LL*a!=ceil(a+b*sqrt(c)))
//printf("NO\n");
//res=(2LL*a)%m;
//printf("ans:%lld myans:%lld\n",(2LL*a)%m,(long long)ceil(a+b*sqrt(c))%m);
long long res=2LL*a%m;
printf("%lld\n",res); }
int main()
{
#ifdef test
//freopen("hdu4565.in","r",stdin);
#endif
while(scanf("%lld%lld%lld%lld",&a,&b,&n,&m)==)
work();
return ;
}
HDU4565 So Easy!的更多相关文章
- HDU4565 So Easy! —— 共轭构造、二阶递推数列、矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4565 So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- hdu4565 So Easy! 矩阵快速幂
A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example ...
- HDU4565 So Easy! 矩阵高速幂外加数学
easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整.再取模,无脑的先试了高速幂 double fmod来做,结果发现是有问题的.这题要做肯定得凑整数,凑 ...
- hdu4565 So Easy!(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 题解:(a+√b)^n=xn+yn*√b,(a-√b)^n=xn-yn*√b, (a+√b)^n ...
- 【HDU4565】So Easy!
[HDU4565]So Easy! 题面 要你求 \[ \lceil (a+\sqrt b)^n \rceil \% m \] 其中\(0<a,m<2^{15},(a-1)^2<b& ...
- HDU 4565 So Easy!(公式化简+矩阵)
转载:http://www.klogk.com/posts/hdu4565/ 这里写的非常好,看看就知道了啊. 题意很easy.a,b,n都是正整数.求 Sn=⌈(a+b√)n⌉%m,(a−1)2&l ...
- HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...
- hdu4565---So Easy!(矩阵)
Problem Description A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ce ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
随机推荐
- spring与springboot中,如何在static方法里使用自动注入的属性
第一步:写注解@Component 使当前类成为一个bean对象.(@Controller,@service都行) 第二步:写个static的变量 第三步:写个@PostConstruct注解注解注释 ...
- android按钮被点击文字颜色变化效果
有的时候做应用需要点击按钮时文字颜色也跟着变,松开后又还原,目前发现两种解决方案:第一用图片,如果出现的地方比较多,那么图片的量就相当可观:第二,也就是本文讲到的.废话少说,先贴图片,再上代码. 正常 ...
- 历届试题 邮局(dfs+剪枝)
历届试题 邮局 时间限制:1.0s 内存限制:256.0MB 问题描述 C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流.为了方便村民们发信,C村打算在C村建设k ...
- python 7:del 列表指定元素、list.pop(索引)、list.remove(元素值)(删除列表指定元素,且不可再使用;默认索引-1,弹出指定列表元素,可再使用;移除列表指定第一个元素)
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) del bicycles[0] #删除指定列表元 ...
- HDU 4901 DP
我觉得这个DP挺难的...然而这只是lydrainbowcat学长幻灯片上的第一题-- 明天考试要GG. 题意: 给你一个序列,让你选出两个集合S和T.保证S里的数都在T里的数的左边.求一共有多少个集 ...
- web 应用
一.web应用 web应用程序是一种可以通过web访问的应用程序,程序 的最大好处是用户很容易访问应用程序,用户只需要有浏览器 即可,不需要安装其他团建,用用程序有两种模式C/S.B/S.C/S是客户 ...
- ListView(2)最简单的上拉刷新、下拉刷新代码
效果 最简单的上拉刷新和下拉刷新,当listview滚动到底部时向上拉刷新数据.当listview滚动到最顶部时下拉刷新. 图1,上拉刷新 图2,下拉刷新 1.设置lisview 加载he ...
- 【Leetcode】376. Wiggle Subsequence
Description: A sequence of numbers is called a wiggle sequence if the differences between successive ...
- SQLServer 里的三种条件判断的用法:Where GroupBy Having
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似.WHERE 子句搜索条件在进行分组操作之前应用:而 HAVING 搜索条件在进行分组 ...
- 上传预览图片的插件jquery-fileupload
上传预览图片的插件jquery-fileupload github地址:https://github.com/blueimp/jQuery-File-Upload 中文文档:http://www.jq ...