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分快速幂

时间: 2024-10-13 18:31:13

vijos P1223的相关文章

vijos - P1223麦森数 (高精度乘法 + 分治 + python)

P1223麦森数 Accepted 标签:NOIP普及组2003[显示标签] 描述 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有909526位.麦森数有许多重要应用,它与完全数密切相关. 任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示) 格式 输入格式 文件中只包含一个整数P(10

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,

vijos P1448 校门外的树

描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0) 输入格式 第一行n,m表示道路总长为n,共有m个操作接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 提示 范围:20%的数据保证,n,m<=10060%的数据保证

Vijos P1061 迎春舞会之三人组舞 DP

题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低. 计算公式为 h=(a-b)^2 (a.b为较矮的2人的身高)现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低; input: 第一排为m,n. 第二排n个数字,保证升序排列. 思路:由于和中间高的人无关,但是每次选旁边两个的时候,会由于没有比这

【vijos】1789 String(组合计数+奇怪的题)

https://vijos.org/p/1789 我yy了一下发现我的方法没错啊,为嘛才80分.. 当n=k的时候,显然这是个排列就能做的,枚举一半必定有且只有一个另一半与之对应,所以直接做就行了. 当k是奇数的时候,我们可以假设有一个奇数长的模型,每一次向右移动一个,显然最前边和最后边.此前边和次后边以此类推,他们都是相等的,也就是说,这个序列一定由两个元素组成(可以相同)那么显然有m*m种方法 当k是偶数的时候,根据前边的分析,显然只有m种序列(每一种序列的元素是一模一样的) 我觉得这是对的