首页 > 代码库 > 深坑之---数学

深坑之---数学

本学期的数学生涯正式开始,第一个进军的毫无疑问是数论。

现在还属于学习和消化阶段,写这样零散地整理知识点,以后再总结。

 

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-130             {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         else60         {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 }
很萌的代码君

 

深坑之---数学