-我实在是太缺练,而且那么笨。
Just say hello to algorithm
做了一下以前发的简单的题目,a题非常水,然而还是wa了一次,因为no greater than 2^32 要开long long,用int 不行,int范围是-2^32~2^32-1
F题
Design Tutorial: Learn from Math
题意:给你一个大于等于12的数,要你用两个合数表示出来。//合数指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数。
分析:为什么给你大与等于12呢,我们知道偶数除了2都是合数,这样给你一个偶数,你减去一个偶数得到的就是偶数啦,因为n>=12,所以减去4的话,得到的是>=8的偶数,肯定也是合数,当然你也可以减去6、8,大于8就不行了。
然后给你奇数呢?你减去给奇数就得到偶数啦,减去一个是合数的奇数,最小的就是9,奇数时:n>=13,n-9>=4
#include<stdio.h> int main(){ int a,b; int n; scanf("%d",&n); if(n%2){ printf("%d %d\n",9,n-9); }else{ printf("%d %d\n",8,n-8); } return 0; }
这题也可以枚举
#include<stdio.h> int isComposite(int a){ if(a==2)return 0; for(int i=2;i*i<=a;i++) if(a%i==0)return 1; return 0; } int main(){ int a,n; scanf("%d",&n); for(a=2;a<n;a++) if(isComposite(a)&&isComposite(n-a)){ printf("%d %d",a,n-a); break; } return 0; }
H题 Pseudoprime numbers
题意:求1^m + 2^m + 3^m + …… + n^m(答案mod 1e9+7)
注意:每个加起来的时候和加起来后也要mod
#include<stdio.h> #define M 1000000007 long long qpow(long long a,long long m)//快速幂 { long long ans=1,k=a; while(m) { if(m&1) ans=(ans*k)%M; k=(k*k)%M; m>>=1; } return ans; } int main() { long long n,m,ans; while(scanf("%lld%lld",&n,&m)!=EOF) { ans=0; for(int i=1; i<=n; i++) ans+=qpow(i,m)%M;//这里mod一下 printf("%lld\n",ans%M);//这里mod一下 } return 0; }
G题 SwapSort
题意:用少于n次的swap来排好序
分析:选择排序,每次在未排序的后面选出最小的一个然后和未排序的第一个交换,这样最多n-1次交换即可排好序,用数组记录交换的两个数的位置。
#include<stdio.h> int n,i,j,a[3002],coun,temp,swap1[3001],swap2[3001]; int main() { scanf("%d",&n); for(i=0; i<n; i++) scanf("%d",a+i); for(i=0; i<n-1; i++) { int minj=i; for(j=i+1; j<n; j++) if(a[j]<a[minj])minj=j; if(i!=minj) { swap1[coun]=i; swap2[coun]=minj; temp=a[minj]; a[minj]=a[i]; a[i]=temp; coun++; } } printf("%d\n",coun); if(coun) for(i=0; i<coun; i++) printf("%d %d\n",swap1[i],swap2[i]); return 0; }
-我太笨了,要加油啊!
时间: 2024-10-13 23:25:05