vijos P1223
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vijos P1223相关的知识,希望对你有一定的参考价值。
首先来看一下这段代码 这样是无法赋值的
#include <iostream> using namespace std; typedef int atype[500]; int main() { atype a,b; b[0]=0; a = b; return 0; }
会报错 如下:
1 In function ‘int main()‘: 2 error: invalid array assignment 3 [Finished in 0.2s with exit code 1]
下面看题
57842 * 65223 = 3772628766 后4位是8766
取57842和65223的后4位相乘
7842 * 5223 = 40958766 后4位还是8766
这是本题的一个基础
代码如下:
1 #include <iostream> 2 #include <cmath> 3 #include <string.h> 4 using namespace std; 5 6 typedef int atype[500]; 7 8 void gaocheng(atype &a ,atype b) 9 { 10 atype c; 11 memset(c,0,sizeof(c)); 12 13 14 for (int i = 0; i <= 499; i++) 15 { 16 for (int j = 0; j <= 499-i; j++) 17 { 18 c[j+i]=c[j+i]+a[j]*b[i]; 19 } 20 } 21 22 for (int i = 0; i <= 498; i++) 23 { 24 c[i+1]=c[i+1] + int(c[i]/10); 25 c[i]=c[i] % 10; 26 } 27 c[499]=c[499] % 10; 28 29 for (int i = 0; i <= 499; i++){a[i]=c[i];} 30 31 } 32 33 34 35 36 int main() 37 { 38 long long p; 39 cin>>p; 40 41 cout<< int( p/log2(10) ) + 1; 42 cout<<endl; 43 44 atype x,z; 45 memset(x,0,sizeof(x)); 46 memset(z,0,sizeof(z)); 47 48 x[0]=1; 49 z[0]=2; 50 51 while (p>0) 52 { 53 if (p%2 ==1){gaocheng(x,z);} 54 55 p=int(p/2); 56 gaocheng(z,z); 57 58 } 59 60 x[0]=x[0]-1; 61 62 63 int sum = 0; 64 for (int i = 499; i >= 0; i--) 65 { 66 sum++; 67 cout<<x[i]; 68 if (sum%50==0) {cout<<endl;} 69 } 70 71 72 return 0; 73 }
这个方法跟 快速幂取模 非常类似
这里同样给出 代码(虽然 algorithm 里详细讲了)
1 int PowerMod(int a, int b, int c) 2 3 { 4 5 int ans = 1; 6 7 a = a % c; 8 9 while(b>0) 10 11 { 12 13 if(b % 2 == 1) 14 15 ans = (ans * a) % c; 16 17 18 b = b/2; 19 20 a = (a * a) % c; 21 22 } 23 24 25 return ans; 26 27 }
这里用列数据的方法验证一下 正确性
可以清楚的看出 用的原理是一样的
2分就是说
x:=2^n
若n为奇数
x:=2^int(n/2)乘2^int(n/2)乘2
若n为偶数
X:=2^int(n/2)乘2^int(n/2)
只要计算2^int(n/2)
继续同样的操作
这就是所谓的2分快速幂
以上是关于vijos P1223的主要内容,如果未能解决你的问题,请参考以下文章