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]

 

下面看题

vijos P1223_第1张图片

vijos P1223_第2张图片

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 }
View Code

 

这个方法跟 快速幂取模  非常类似  

这里同样给出 代码(虽然 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 }
View Code

 

这里用列数据的方法验证一下 正确性 

vijos P1223_第3张图片

可以清楚的看出  用的原理是一样的    

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)