标签:style blog http color os io ar strong for
本学期的数学生涯正式开始,第一个进军的毫无疑问是数论。
现在还属于学习和消化阶段,写这样零散地整理知识点,以后再总结。
1. 模算术 ( 快速幂取模 )
//在O(logn)的时间复杂度完成 a^b % m 的计算 //另外还有模算术 (a+b)%c =( a%c + b%c ) %c (a-b)%c =( a%c - b%c + c) %c (ab)%c = (a%c)(b%c) % c
LL fast_mod(LL a,LL b,LL n) { LL ans = 1; while(b) { if(b&1) ans = ans*a % n; a = (a%n) * (a%n) % n; b >>= 1; } return ans; }
先记录下我做的两道题目
a.HDU 3003 简直不能再坑,题目读了老半天还是没搞懂题目的意思。。。。
题目大意:
一种动物有n层皮肤,每层皮肤都有两种状态,透明或者不透明,透明的皮肤光照一天变为不透明,不透明的皮肤光照一天变为透明
光可以透过透明的皮肤照射到下一层。 刚出生的动物所有层的皮肤都是不透明的,每层皮肤都变过透明,则这只动物长大成人。(特别注意是变过,,而不是所有成都一起变透明)
问,给定一个N,表示N层皮肤,问第几天可以长大成人,得数MOD上N、
题解:
如果这样的话,可以推算出公式 ans = 2^(n-1) + 1 结果 mod n, 那么,这题就是一个很裸很裸的快速幂取模了。。
1 /* *********************************************** 2 Problem :HDU3003 3 File Name : 4 Author : 5 Created Time :2014-09-09 20:29:58 6 ************************************************ */ 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 typedef long long LL; 11 using namespace std; 12 int n; 13 14 LL fast_mod(LL a,LL b,LL n) 15 { 16 LL ans = 1; 17 while(b) 18 { 19 if(b&1) ans = ans*a % n; 20 a = (a%n) * (a%n) % n; 21 b >>= 1; 22 } 23 return ans; 24 } 25 26 int main() 27 { 28 while(~scanf("%d",&n) && n) 29 { 30 int ans = (fast_mod(2,n-1,n) + 1 ) % n; 31 printf("%d\n",ans); 32 } 33 return 0; 34 }
b.Uva11582 - Colossal Fibonacci Numbers! ( 快速幂取模 + 打表 )
题目大意:
对于斐波那契数列来说,f[i] = f[i-1] + f[i-2];
现在问对于一个很大的数num = a^b , f[num] % n等于多少。
输入 a b n 输出 f[num] % n
题解:
因为全部是对n取模
令F[i] = f[i]%n
余数最多有n种,所以循环节最长是n^2,紫书是这样说的,具体证明不会。
1 /* *********************************************** 2 Problem :11582 - Colossal Fibonacci Numbers! 3 File Name : 4 Author : 5 Created Time :2014-09-09 20:29:58 6 ************************************************ */ 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 #include <vector> 11 using namespace std; 12 typedef unsigned long long ull; 13 14 vector<int> fib[1005]; 15 int period[1005]; 16 int t,n; 17 ull a, b; 18 19 void init() 20 { 21 for(int i=2;i<=1000;i++) 22 { 23 fib[i].push_back(0); 24 fib[i].push_back(1); 25 for(int j=2;;j++) 26 { 27 int t = (fib[i][j-1] % i + fib[i][j-2] % i) % i; 28 fib[i].push_back(t); 29 if(fib[i][j] == 1 && fib[i][j-1] == 0) //出现循环节,总数为j-1 30 { 31 period[i] = j - 1; 32 break; 33 } 34 } 35 } 36 } 37 38 int q_pow_mod(ull a,ull b,int m) 39 { 40 int ans = 1; 41 while(b) 42 { 43 if(b&1) ans = (int)((ans*a) % m); 44 a = (a%m) * (a%m) % m; 45 b >>= 1; 46 } 47 return ans; 48 } 49 50 int main() 51 { 52 freopen("1.txt","r",stdin); 53 init(); 54 scanf("%d",&t); 55 while(t--) 56 { 57 scanf("%llu %llu %d",&a,&b,&n); 58 if(a == 0 || n == 1) printf("0\n"); 59 else 60 { 61 int k = q_pow_mod(a%period[n], b, period[n]); 62 printf("%d\n",fib[n][k]); 63 } 64 } 65 return 0; 66 }
标签:style blog http color os io ar strong for
原文地址:http://www.cnblogs.com/BigBallon/p/3963333.html