大数取模的两道题。
虐狗宝典学习笔记:
两个数值执行算术运算时,以参与运算的最高数值类型为基准,与保存结果的变量类型无关。两个32位整数的成绩可能超过int类型的表示范围,但是CPU只会用一个32位寄存器保存结果,造成越界,此时我们必须把其中一个数强制转换成64位整数类型long long参与运算。得到正确的结果,取模后,执行赋值操作时,该结果会被隐式转换成int存回。
CH0101---a^b
1 #include <bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long LL; 5 6 int power(int a, int b, int p) 7 { 8 int ans = 1 % p; 9 while(b){ 10 if(b & 1) ans = (long long) ans * a % p; 11 a = (long long)a * a % p; 12 b >>= 1; 13 } 14 return ans; 15 } 16 17 int main() 18 { 19 int a, b, p; 20 scanf("%d%d%d", &a, &b, &p); 21 printf("%d ", power(a, b, p)); 22 return 0; 23 }
CH0102---64位整数乘法
1 #include <bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long LL; 5 6 long long mul(long long a, long long b, long long p) 7 { 8 long long ans = 0; 9 while(b){ 10 if(b & 1) ans = (ans + a) % p; 11 a = a * 2 % p; 12 b >>= 1; 13 } 14 return ans; 15 } 16 17 int main() 18 { 19 LL a, b, p; 20 scanf("%lld%lld%lld", &a, &b, &p); 21 printf("%lld ", mul(a, b, p)); 22 return 0; 23 }