hdu--4549--费马小定理&快速幂&欧拉函数

这题 蛮复杂的.

我自己做的时候 无法处理完 最后一步公式的转换 后来看到别人说这是 费马小定理 与 欧拉函数的思想下的转换

可是 我自己还推导不出来啊...

首先 你要发现f[n]=a^x * b^y其实指数x 与 y是fib数列中的f[n-1]与f[n]项( n>=1 并且数列是0 1 1 2 3 5 8 ...)

那么 其实题目就转换成了 f[n] = a^fib[n-1] * b^fib[n] % mod;

这边 不必要对于 a^fib[n-1]与 b^fib[n] 单独再在括号进行取模运算 因为Mod = 1000000007 太大了 即使单独取模 还是会存在溢出的可能 因为只要(mod-1)%mod = mod-1那么这 (mod-1)^2肯定溢出int了  所以 就直接用Long long就是了

然后我就是不会对于fib[n-1]进行化简取模了  因为不对它取模 肯定是溢出的 可是我想不明白 具体的MOD 应该取多少呢?

就去看了别人的解释 说是 费马小定理与欧拉函数的联系吧

当p是素数的时候 满足

a(p) ≡ a(mod p)

当p是素数的时候 并且gcd(a,p) == 1的时候  满足

a(p-1) ≡1(mod p)

还有一个就是 a( euler(p) ) ≡1(mod p)

当p是素数的时候 那么euler(p) 自然就是p-1了

然后 将2者联系起来 就可以化简为     a^fib(n-1) = a^( fib(n-1)%(mod-1)  ) % (mod)

但是 这2者怎么联系 转换 我没求导出来 太渣了 烦.

 1 #include <iostream>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const LL mod = 1000000007;
 6 struct matrix
 7 {
 8     LL m[2][2];
 9 }base,ans;
10
11 matrix multi( matrix& p , matrix& q , int col )
12 {
13     matrix temp;
14     for( int i = 0 ; i<2 ; ++i )
15     {
16         for( int j = 0 ; j<col ; ++j )
17         {
18             temp.m[i][j] = 0;
19             for( int k = 0 ; k<2 ; ++k )
20             {
21                 temp.m[i][j] = ( temp.m[i][j] + p.m[i][k] * q.m[k][j] )%(mod-1);
22             }
23         }
24     }
25     return temp;
26 }
27
28 void fastMod( LL n )
29 {
30     while( n )
31     {
32         if( n&1 )
33         {
34             ans = multi( base , ans , 1 );
35         }
36         base = multi( base , base , 2 );
37         n >>= 1;
38     }
39 }
40
41 LL solve( LL x , LL n )
42 {
43     LL ans = 1;
44     while( n )
45     {
46         if( n&1 )
47         {
48             ans = x * ans % mod;
49         }
50         n >>= 1;
51         x = x * x % mod;
52     }
53     return ans;
54 }
55
56 int main()
57 {
58     cin.sync_with_stdio(false);
59     LL a , b , n , var;
60     while( cin >> a >> b >> n )
61     {
62         ans.m[0][0] = 1;
63         ans.m[1][0] = 1;
64         base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
65         base.m[1][1] = 0;
66         if( !n )
67             cout << a << endl;
68         else if( n==1 )
69             cout << b << endl;
70         else if( n==2 )
71             cout << (a*b%mod) << endl;
72         else
73         {
74             fastMod( n-2 );
75             a = solve( a , ans.m[1][0] );
76             b = solve( b , ans.m[0][0] );
77             var = a * b % mod;s
78             cout << var << endl;
79         }
80     }
81     return 0;
82 }

时间: 2024-11-07 03:35:32

hdu--4549--费马小定理&快速幂&欧拉函数的相关文章

hdu 4704 费马小定理+快速幂

题意就是:做整数拆分,答案是2^(n-1) 由费马小定理可得:2^n % p = 2^[ n % (p-1) ]  % p 当n为超大数时,对其每个数位的数分开来加权计算 当n为整型类型时,用快速幂的方法求解 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const in

hdu 4704 Sum (费马小定理+快速幂)

//(2^n-1)%mod //费马小定理:a^n ≡ a^(n%(m-1)) * a^(m-1)≡ a^(n%(m-1)) (mod m) # include <stdio.h> # include <algorithm> # include <string.h> # define mod 1000000007 using namespace std; __int64 pow(__int64 n) { __int64 p=1,q=2; while(n) { if(n%

2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少时最少的个数,rb代表1最多时的个数.一张牌翻两次和两张牌翻一次 得到的奇偶性相同,所以结果中lb和最多的rb的奇偶性相同.如果找到了lb和rb,那么,介于这两个数之间且与这两个数奇偶性相同的数均可取到,然后在这个区间内求组合数相加(若lb=3,rb=7,则3,5,7这些情况都能取到,也就是说最后的

HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a,

HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)

题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases. 题意是输入一个N,求N被分成1个数的结果+被分成2个数的结果+...+被分成N个数的结果,N很大 1.隔板原理 1~N有

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色

hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Holion August will eat every thing he has found. Now there are many foods,but he does not want to eat all of them at once,so he fi

HDU4869:Turn the pokers(费马小定理+快速幂)

Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. She went out and bought m pokers, tending to play poker. But she hated the traditional gameplay. She wants to change. She puts these pokers face down,

hdu1576-A/B-(同余定理+乘法逆元+费马小定理+快速幂)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10383    Accepted Submission(s): 8302 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个