码迷,mamicode.com
首页 > 其他好文 > 详细

同余与模算术

时间:2018-09-09 18:01:46      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:ret   思路   大整数取模   形式   char   nbsp   strong   log   strlen   

一、大整数取模

求n mod m 的值,(n ≤10100,m ≤109)

思路:首先,将大整数根据秦九韶公式写成“自左向右”的形式:4351 = ((4 * 10 + 3) * 10 + 5) * 10 + 1,然后利用模的性质,逐步取模。

 

 1 const int maxn = 100 + 10;
 2 char n[maxn];
 3 int m;
 4 
 5 int biginteger_mod(char* n, int m)
 6 {
 7     int len = strlen(n);
 8     int ans = 0;
 9     for(int i = 0;i < len;i++)
10         ans = (int)(((long long)ans * 10 + n[i] - 0) % m);
11     return ans;
12 }

 

二、幂取模

直接暴力写是O(n),较快的方法是分治法,时间复杂度是O(logn)

求an mod m 的值, (a,n,m ≤109)

 

1 int pow_mod(int a, int n, int m)
2 {
3     if (n == 0)  return 1;
4     int x = pow_mod(a, n / 2, m);
5     long long ans = (long long)x * x % m;
6     if (n % 2)  ans = ans * a % m;
7     return (int)ans;
8 }

 

同余与模算术

标签:ret   思路   大整数取模   形式   char   nbsp   strong   log   strlen   

原文地址:https://www.cnblogs.com/lfri/p/9614074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!