HDU4565 So Easy!

  1 /*
  2  HDU4565 So Easy!
  3  http://acm.hdu.edu.cn/showproblem.php?pid=4565
  4  数论 快速幂 矩阵快速幂
  5  题意:求[(a+sqrt(b))^n ]%m [ ]代表向上取证
  6  联想到斐波那契数列,所以第一感觉是矩阵快速幂
  7  后来发现根本不用这么麻烦,我们认为a+b*sqrt(c)中的a为实部
  8  b为虚部,就能直接用二元乘法模拟矩阵快速幂了,因此这两种方法
  9  是等价的。于是乎,我们就解决了精度问题。
 10  然而即使我们得出了结果中的a+b*sqrt(c)也不能这么算
 11  因为[b*sqrt(c)]%m不和[b%m*sqrt(c)]%m同余,因此只能另辟蹊径。
 12  注意到题目中的(a-1)^2< b < a^2 <=> 0<a-sqrt(b)<1
 13  所以 0<(a+sqrt(b))^n<1 而 (a+sqrt(b))^n与(a-sqrt(b))^n是公轭的
 14  所以其和只剩下了实部的二倍。因此只需求出实部,将其乘以2就是答案。
 15  */
 16 #include <cstdio>
 17 #include <algorithm>
 18 #include <cstring>
 19 #include <cmath>
 20 #include <vector>
 21 #include <queue>
 22 #include <iostream>
 23 #include <map>
 24 #include <set>
 25 #define test
 26 using namespace std;
 27 const int Nmax=1005;
 28 //const long long mod=2147483647LL;
 29 //double eps=1e-8;
 30 long long a,b,n,m;
 31 struct Num
 32 {
 33     long long a;
 34     long long b;
 35     long long c;
 36     Num(long long _a,long long _b,long long _c)
 37     {
 38         a=_a;
 39         b=_b;
 40         c=_c;
 41     }
 42     friend Num operator * (Num x,Num y)
 43     {
 44         long long a1=x.a%m,b1=x.b%m,a2=y.a%m,b2=y.b%m,c=x.c;
 45         long long a=(a1*a2%m+((c*b1*b2)%m))%m;
 46         long long b=((a1*b2)%m+((b1*a2)%m))%m;
 47         return Num(a,b,c);
 48     }
 49     friend Num qpow(Num base,long long n)
 50     {
 51         Num ans(1LL,0LL,base.c);
 52         //ans.print();
 53         while(n>0LL)
 54         {
 55             if(n&1LL)
 56                 ans=ans*base;
 57             base=base*base;
 58             n>>=1;
 59             //ans.print();
 60         }
 61         //printf("%lld %lld %lld\n",ans.a,ans.b,ans.c);
 62         return ans;
 63     }
 64     void print()
 65     {
 66         printf("a:%lld b:%lld c:%lld\n",a,b,c);
 67     }
 68 };
 69
 70 void work()
 71 {
 72     Num base(a,1LL,b);
 73     Num ans=qpow(base,n);
 74     //ans.print();
 75     long long a=ans.a,b=ans.b,c=ans.c;
 76     //long long res=(long long)ceil(a+b*sqrt(c));//不能这么写,因为整数和小数直接不能模
 77     //while(a<=0)
 78         //a+=m;
 79     //while(b<=0)
 80         //b+=m;
 81     //ans.print();
 82     //long long res=(long long)ceil(a+b*sqrt(c));
 83     //printf("res:%lld\n",res);
 84     //res=res%m;
 85     //printf("%lld %lld %ll\n",a,b);
 86     //ans.print();
 87     //if(2LL*a!=ceil(a+b*sqrt(c)))
 88         //printf("NO\n");
 89     //res=(2LL*a)%m;
 90     //printf("ans:%lld myans:%lld\n",(2LL*a)%m,(long long)ceil(a+b*sqrt(c))%m);
 91     long long res=2LL*a%m;
 92     printf("%lld\n",res);
 93
 94 }
 95 int main()
 96 {
 97     #ifdef test
 98     //freopen("hdu4565.in","r",stdin);
 99     #endif
100     while(scanf("%lld%lld%lld%lld",&a,&b,&n,&m)==4)
101         work();
102     return 0;
103 }
时间: 2024-08-06 19:50:25

HDU4565 So Easy!的相关文章

HDU4565 So Easy! 矩阵快速幂外加数学

easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整,再取模,无脑的先试了快速幂 double  fmod来做,结果发现是有问题的,这题要做肯定得凑整数,凑整  题目给 a+√b 那么加上a-√b就可以了,可是这样加上后面怎么处理还得减去,想了半年也想不出来, 原来用了负数的共轭思想,还有就是题目给的b的范围 是 ((a-1)*(a-1),a*a),所以 a-√b的值的 无论多少次方 的值都是小于1的,所以对于原式子 改装成 ((a + √b) ^n+

HDU4565 So Easy! 矩阵高速幂外加数学

easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整.再取模,无脑的先试了高速幂 double  fmod来做,结果发现是有问题的.这题要做肯定得凑整数,凑整  题目给 a+√b 那么加上a-√b就能够了.但是这样加上后面怎么处理还得减去.想了半年也想不出来. 原来用了负数的共轭思想.还有就是题目给的b的范围 是 ((a-1)*(a-1),a*a).所以 a-√b的值的 不管多少次方 的值都是小于1的,所以对于原式子 改装成 ((a + √b) ^n+

HDU4565 So Easy!【矩阵连乘】【推导】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4565 题目大意: 定义Sn = [( a + √b )^n] % m,[x]表示x向上取整,比如[3.14] = 4.给你a b n m的值, 求Sn是多少. 思路: 这道题很经典,因为(a-1)^2< b < a^2,所以0 < |a-√(b)| < 1,所以 Sn = [( a + √b )^n] % m = ( [( a + √b )^n]  + [( a - √b))^n]

【矩阵快速幂】HDU4565 So Easy!

题意:给a, b, n, m 求 $\left \lceil ( a+ \sqrt b )^n \right \rceil$ % m 看到 $( a+ \sqrt b )^n$ 虽然很好联想到共轭 但是推出矩阵还是比较难的 数据范围为:$(a-1)^2 < b < a^2$ 那么  $a-1 < sqrt b < a$ 那么          $0 < a-sqrt b < 1$

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=2*xn-(a-√b)^n,(0<=a-√b<=1),所以整数部分就是2*xn 然后再利用两个公式 (a+√b)^(n+1)=(a+√b)*(xn+yn*√b) (a-√b)^(n+1)=(a-√b)*(xn-yn*√b) 联立得到 x(n+1)=a*xn+b*yn y(n+1)=xn+a*yn

hdu4565---So Easy!(矩阵)

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 lin

地理数据可视化:Simple,Not Easy

如果要给2015年的地理信息行业打一个标签,地理大数据一定是其中之一.在信息技术飞速发展的今天,“大数据”作为一种潮流铺天盖地的席卷了各行各业,从央视的春运迁徙图到旅游热点预测,从大数据工程师奇货可居到马云布道“DT”时代,“大数据”被推到了一个前所未有的高度,连国家领导人出访演讲都言必称大数据.地理信息数据天生具有大数据属性,作为整天和地理信息数据打交道的地信人自然不甘落后,地理大数据概念脱颖而出. 地理大数据是什么?大体来说就是把社会经济.自然资源.商业信息等但凡具有一点空间维度的数据一股脑

哈理工2015暑假训练赛BNU16488 Easy Task(简单题)

A - Easy Task Time Limit:2000MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu SubmitStatusPracticeZOJ 2969 Description Calculating the derivation of a polynomial is an easy task. Given a function f(x) , we use (f(x))' to denote its derivatio

Designing CSS Layouts With Flexbox Is As Easy As Pie

This article is an updated excerpt of the chapter "Restyle, Recode, Reimagine With CSS3″ from our Smashing Book #3, written by Lea Verou and David Storey. - Ed. Flexible box layout (or flexbox) is a new box model optimized for UI layout. As one of th