ACM1009[2的N次方]

合集下载

acm算法经典例题

acm算法经典例题

一、数论1: Wolf and Rabbit描述There is a hill with n holes around. The holes are signed from 0 to n-1.A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m holes. For example, m=2 and n=6, the wolf will get into the holes which are signed 0,2,4,0. If the rabbit hides in the hole which signed 1,3 or 5, she will survive. So we call these holes the safe holes.输入The input starts with a positive integer P which indicates the number of test cases. Then on the following P lines,each line consists 2 positive integer m and n(0<m,n<2147483648).输出For each input m n, if safe holes exist, you should output "YES", else output "NO" in a single line.样例输入21 22 2样例输出NOYES翻译:描述一座山有n个洞,洞被标记为从0到n-1。

C语言程序设计100例之(66):计算2的N次方

C语言程序设计100例之(66):计算2的N次方

C语⾔程序设计100例之(66):计算2的N次⽅例66 计算2的N问题描述任意给定⼀个正整数N(1<=N<=100),计算2的n次⽅的值。

输⼊输⼊⼀个正整数N。

输出输出2的N次⽅的值。

输⼊样例5输出样例32(1)编程思路1当N=100时,2的N次⽅是⼀个很⼤的数,超出了⼀个长整数的表数范围。

因此,为了保存2的N次⽅,可以定义⼀个数组int a[35];,每个数组元素a[i]保存结果整数的1位数,例如,保存整数1024时,a[0]=4,a[1]=2,a[2]=0,a[3]=1,并记整数的位数len=4。

这样⼀个整数乘以2,可以将每个数组元素乘以2,同时进⾏进位处理即可。

(2)源程序1#include <stdio.h>#include <string.h>int main(){int n;scanf("%d",&n);int a[35];memset(a,0,sizeof(a));a[1]=1;int i,j,len=1;for(i=1;i<=n;i++){int cf=0;for (j=1;j<=len;j++){a[j]=a[j]*2+cf;cf=a[j]/10;a[j]=a[j]%10;}while (cf!=0){a[++len]=cf%10;cf/=10;}}for (i=len;i>=1;i--)printf("%d",a[i]);printf("\n");return 0;}(3)编程思路2⼀个数组元素只保存整数的1位数字,这样既浪费存储空间,同时耗时。

实际上,⼀个数组元素可以保存9位数字都没有问题,因为1个9位数乘以2,不会超过整数的表数范围。

下⾯的程序采⽤1个数组元素保存整数的6位数字。

例如,整数1234567890,可以保存为a[0]=567890,a[1]=1234,并记整数的位数len=2。

acm数论知识点总结

acm数论知识点总结

acm数论知识点总结1. 整除与余数整除是数论中最基本的概念之一。

如果一个整数a可以被另一个整数b整除,那么我们说b是a的一个因子,记作b|a。

如果a不能被b整除,记作b∣a。

另外,如果a除以b得到的商为q,余数为r,那么我们有a=bq+r,并且0≤r<|b|。

这里的余数r可以用来求解问题,比如判断一个数是奇数还是偶数;或者用来求解同余方程。

2. 最大公约数和最小公倍数两个整数a和b的最大公约数(Greatest Common Divisor,GCD)是能够整除a和b的最大的整数。

通常记作gcd(a, b)。

最小公倍数(Least Common Multiple,LCM)是能够被a和b整除的最小的整数。

通常记作lcm(a, b)。

最大公约数和最小公倍数可以用辗转相除法快速求解,而且它们有一些常见的性质,比如gcd(a, b)⋅lcm(a, b)=a⋅b。

3. 素数素数是指只能被1和自身整除的正整数。

素数在数论中是非常重要的,它们有许多特殊的性质。

比如任意一个整数都可以分解成若干个素数的乘积。

素数在ACM竞赛中常用于判断数字的性质,或者用于设计算法。

4. 同余同余是数论中一个重要的概念,如果两个整数a和b除以一个正整数m得到的余数相同,那么我们就说a同余b模m,记作a≡b(mod m)。

同余关系具有传递性和对称性,满足一些特殊的性质。

同余关系可以用来求解很多问题,比如求解同余方程、构造递归关系等。

5. 奇数和偶数奇数是最基本的整数,它们可以被2整除;偶数是能够被2整除的整数。

奇数和偶数在一些问题中有特殊的性质,比如奇数乘以奇数得到的是奇数,奇数加偶数得到的是奇数等。

6. 欧拉定理欧拉定理是数论中一个著名的定理,它为解决同余方程提供了一个重要的工具。

欧拉定理表明,如果正整数a和m互质(即gcd(a, m)=1),那么a的欧拉函数值为φ(m),则a^φ(m)≡1(mod m)。

欧拉定理在RSA密码算法中有重要应用。

时间复杂度为2的n次方的算法

时间复杂度为2的n次方的算法

时间复杂度为2的n次方的算法算法是计算机科学中非常重要的一个概念,也是各行各业广泛应用的技术。

其中,时间复杂度是衡量算法效率的一种指标,而时间复杂度为2的n次方的算法则是一种具有高度计算复杂度的算法。

时间复杂度是指算法执行所需的时间随各种问题规模的增长而增长的趋势。

这种趋势通常用“大O记号”表示,例如 O(n)、O(n^2)等。

而时间复杂度为2的n次方的算法,就是指当问题规模为n时,所需要执行的时间约为2的n次方(2^n)。

在实际应用中,很多算法的时间复杂度都是难以计算的,需要通过实验或者理论推算得出。

而时间复杂度为2的n次方的算法,由于具有明显的指数增长趋势,因此往往可以轻易地被识别出来。

那么,时间复杂度为2的n次方的算法具体是怎样的呢?我们可以通过以下步骤来深入了解:1. 假设我们需要对一个包含n个元素的集合进行全排列操作。

这个集合可以是一个字符串、数组、列表等等。

2. 对于一个n元素的集合,其全排列数量为n的阶乘,即n!。

这个数量随着n的增长迅速增加。

3. 如果我们使用暴力枚举的方法进行全排列操作,需要对n个元素进行n次选择,每次选择出一个元素作为排列的一部分。

同时,每次选择之后,还需要对剩下的n-1个元素进行全排列操作。

这样下去,直到无法选择任何元素为止。

4. 假设我们使用递归函数来实现全排列操作。

在每次选择元素之后,将剩余元素的所有全排列结果传递到下一层递归中,然后在下一层递归中再次选择一个元素并进行全排列操作。

直到递归层数达到了n-1层,我们得到了所有元素的全排列结果。

5. 显然,这种方法需要进行n层递归,每层递归需要进行n次选择操作并传递n-1个元素的全排列结果。

因此,总时间复杂度为O(n!),即O(2的n次方)。

6. 当n的值很小时,这种算法的性能还是可以接受的。

但是,随着n的增长,计算时间将呈指数级增长,很容易就超出了计算机的承受能力。

综上所述,时间复杂度为2的n次方的算法是一种具有较高计算复杂度的算法,需要在实际应用时慎重考虑。

c++ 信奥赛 计算2的n次方

c++ 信奥赛 计算2的n次方

标题:探讨C++在信奥赛中计算2的n次方的应用一、引言在计算机编程的世界中,C++语言一直以其高效、灵活和强大的特性受到广泛关注。

而在计算机竞赛中,特别是信奥赛(即信息学奥林匹克竞赛)中,C++语言的应用更是无处不在。

本文将介绍C++在信奥赛中计算2的n次方的应用,通过深入的探讨和广度的展示,帮助读者更加全面地理解相关概念和技能。

二、计算2的n次方的意义与应用在计算机编程中,经常需要对数值进行指数运算,其中最基本的指数运算就是计算2的n次方。

在信奥赛中,计算2的n次方通常以多种形式出现,例如在问题求解、算法设计、数据结构等方面。

掌握高效、准确地计算2的n次方对于参加信奥赛的选手至关重要。

三、常规方法与问题1. 暴力循环法:最直接的方法是使用循环将2连乘n次,但当n较大时,时间复杂度将变得非常高,无法满足信奥赛中对效率的要求。

2. 位运算法:利用位运算的特性,可以通过移位操作快速计算2的n次方,这是一种常见而高效的方法,但对于初学者来说存在一定难度。

四、C++语言中的计算2的n次方在C++语言中,有多种方法可以计算2的n次方,下面将分别介绍几种常见的方法并给出代码示例。

1. 使用循环迭代法计算2的n次方```cppint powerOfTwo(int n) {int result = 1;for (int i = 0; i < n; i++) {result *= 2;}return result;}```2. 使用位运算法计算2的n次方```cppint powerOfTwo(int n) {return 1 << n;}```3. 使用递归法计算2的n次方```cppint powerOfTwo(int n) {if (n == 0) {return 1;}return 2 * powerOfTwo(n-1);}```以上是几种常见的在C++语言中计算2的n次方的方法,每种方法都有其适用的场景和特点,选手需要根据实际情况选择合适的方法以提高效率和精度。

acm编程例题 参考答案

acm编程例题 参考答案

acm编程例题参考答案ACM编程例题参考答案ACM(Advanced Computer Mathematics)是一种面向计算机科学与技术的竞赛形式,旨在提高参与者的编程技能和解决问题的能力。

ACM编程例题是指在ACM竞赛中出现的一系列编程题目,这些题目涵盖了各种算法和数据结构的应用。

本文将给出一些ACM编程例题的参考答案,希望能够帮助读者更好地理解和掌握这些题目的解法。

一、题目一:最大公约数题目描述:给定两个正整数a和b,求它们的最大公约数。

解题思路:最大公约数可以通过欧几里得算法来求解。

该算法的基本思想是,两个正整数的最大公约数等于其中较小的数和两数之差的最大公约数。

具体的实现可以使用递归或循环的方式。

代码示例:```c++int gcd(int a, int b) {if (b == 0) {return a;}return gcd(b, a % b);}```二、题目二:素数判断题目描述:给定一个正整数n,判断它是否为素数。

解题思路:素数是只能被1和自身整除的正整数。

判断一个数是否为素数可以使用试除法,即从2开始,依次判断n是否能被2到sqrt(n)之间的数整除。

如果存在能整除n的数,则n不是素数;否则,n是素数。

代码示例:```c++bool isPrime(int n) {if (n <= 1) {return false;}for (int i = 2; i * i <= n; i++) {if (n % i == 0) {return false;}}return true;}```三、题目三:字符串反转题目描述:给定一个字符串s,将其反转后输出。

解题思路:字符串反转可以通过将字符串的首尾字符依次交换来实现。

可以使用双指针的方式,一个指针指向字符串的首字符,另一个指针指向字符串的尾字符,然后交换两个指针所指向的字符,并向中间移动,直到两个指针相遇。

代码示例:```c++void reverseString(string& s) {int left = 0;int right = s.length() - 1;while (left < right) {swap(s[left], s[right]);left++;right--;}}```四、题目四:二分查找题目描述:给定一个有序数组和一个目标值,使用二分查找算法在数组中找到目标值的索引,如果目标值不存在,则返回-1。

ACM_ICPC-2简单计算题一-限制下时间复杂度-ACM算法

ACM_ICPC-2简单计算题一-限制下时间复杂度-ACM算法

题目分析:
• 能被3整除的整数的特点? • 如果两个数的和能被3整除,这两个数有什么特点? • 关于能否被3整除,这两个数一共有多少种组合?
还要看程序吗?
22/38
#include<stdio.h> int main() {
long n; while(scanf("%ld",&n) != EOF) if (n%8==2 || n%8==6)
3整除,她才会跟 Silentsky约会。比如,在第132天,1+3+2=6能被3整除,lcy就会答应和他约会;在第133天,1+3+3=7不能被3整除,lcy就 不会跟他约会。Silentsky很心急,他迫切地想知道,从第a天到第b天(包括第a天和第b天),
他能和lcy约会多少次,你能编写程序帮助他么?
20/38
• Sample input: 0123456
• Sample output: no no yes no no no yes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
21/38
winhitlex(c,yin;>>x>>y) { while(cin>>x>>y)
{ cout<<x*y/gcd(x,y)<<end1;
} cout<<x/gcd(x,y)*y<<end1;
}
re}turn 0; return 0;
}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}

acm试题及答案

acm试题及答案

acm试题及答案ACM试题及答案试题 1: 给定一个整数数组,请找出数组中第二大的数。

答案:1. 对数组进行排序。

2. 数组排序后,倒数第二个元素即为第二大的数。

试题 2: 编写一个函数,计算给定字符串中字符出现的次数。

答案:```pythondef count_characters(s):count_dict = {}for char in s:if char in count_dict:count_dict[char] += 1else:count_dict[char] = 1return count_dict```试题 3: 判断一个数是否为素数。

答案:1. 如果数小于2,则不是素数。

2. 从2开始到该数的平方根,检查是否有因数。

3. 如果没有因数,则该数是素数。

试题 4: 实现一个算法,将一个整数数组按照奇数在前,偶数在后的顺序重新排列。

答案:```pythondef rearrange_array(arr):odd = []even = []for num in arr:if num % 2 == 0:even.append(num)else:odd.append(num)return odd + even```试题 5: 给定一个链表,删除链表的倒数第n个节点。

答案:1. 遍历链表,找到链表的长度。

2. 再次遍历链表,找到倒数第n个节点的前一个节点。

3. 将前一个节点的next指针指向当前节点的下一个节点。

4. 如果当前节点是头节点,则更新头节点。

试题 6: 编写一个函数,实现字符串反转。

答案:```pythondef reverse_string(s):return s[::-1]```试题 7: 给定一个整数数组,找出数组中没有出现的最小正整数。

答案:1. 遍历数组,使用哈希表记录出现的数字。

2. 从1开始,检查每个数字是否在哈希表中。

3. 第一个不在哈希表中的数字即为答案。

试题 8: 实现一个算法,计算斐波那契数列的第n项。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2的N次方
时间限制(普通/Java) : 1000 MS/ 3000 MS运行内存限制: 65536 KByte
总提交: 2543 测试通过: 1238
比赛描述
编程精确计算2的N次方。

(N是介于100和1000之间的整数)。

输入
正整数N (100≤N≤1000)
输出
2的N次方
样例输入
200
样例输出1606938044258990275541962092341162602522202993782792835301376
来自</acmhome/problemdetail.do?&method=showdetail&id=1009>
//程序基本思路,第一个循环用来乘方,每循环一次乘一个2;第二个循环用来按位乘,将数用数组表示,每次循环从数组的第一位依次乘2,直至当前数的最后一位。

其中count 用来统计这个数的位数。

Flag在发生进位时起作用。

#include<stdio.h>
int main()
{
int n,i,j;
int num[305]={0};
int flag=0,count=1;
num[0]=2;
scanf("%d",&n);//读入累乘次数
for(i=1;i<n;i++)//第一循环
{
for(j=0;j<count;j++)//第二循环
{
num[j]*=2;
num[j]+=flag;//将后一位的进位加到当前位,当为第一位时,flag=0.
flag=0;//消除进位作用,以免再下一步中影响结果。

if(num[j]>=10)//判断是否发生进位
{
if(num[count-1]>=10)//当最高位发生进位时,位数加一
count++;
flag=1;//进位标志
num[j]-=10;//将当前位的进位消除
}
}
}
for(i=count-1;i>=0;i--)//循环输出
{
printf("%d", num[i]);
}
printf("\n");
return 0;
}。

相关文档
最新文档