HDU的几道水题。
自己感觉有一些小的注意点。
码一下。
HDU 1098![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/774fb55d9bfe72a5f92aa5890de9cfa0.png)
其实我觉得,这是一道数学题…
解题思路:数学归纳法
f(x)=5x13+13x5+kax
假设当x=n时,65|f(x)成立,那一定有 65|f(n+1)成立,那么65|(f(n+1)-f(n)) 成立。
通过二项展开可以得到只要18+k*a可以被65整除就可以了。
(PS:13、5都是质数,用二项式定理的时候结果一定是13或5的倍数!)
所以在0~64之间遍历就ok。
(65肯定不对,如果超过65的话,e.g.66相当于65+1,65k可以不看)
放个代码。
#include<iostream>
using namespace std;
int main(){
int k,a;
while(cin>>k){
for(a=0;a<=65;a++){
if((18+k*a)%65==0) break;
}
if(a==66) cout<<"no"<<endl;
else cout<<a<<endl;
}
return 0;
}
HDU 1001
(看着极其简单,就是一直出wrong answer!!!)
一拿到这道题,正常思维:高斯求和嘛!然后开始用公式了:n*(n+1)/2,觉得多简单,然后submit之后就是wrong answer,我刚开始以为是blank line的问题,后来发现怎么调都不对,查了下别人的博客,发现有一句话很重要但没注意:You may assume the result will be in the range of 32-bit signed integer. 所以是n*(n+1)超了范围……
根据一篇博客上面写的如下可以解决:
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n%2==0) cout<<n/2*(n+1)<<endl<<endl;
else cout<<(n+1)/2*n<<endl<<endl;
}
return 0;
}
先判断一下n的奇偶性,把n或n+1先/2,这样就不会超范围辣~
PS:有时候你发现,最笨的方法,好像,毫无难度……
哭了。
另附:
刚开始以为自己blank line错了,就问XL怎么样使输出的最后一个数字后面没有空行。XL提供的方法不错,记小本本上:
思路:先把第一个数输出,以后再输出的时候先输出一个空行,再输出数,perfect。
方法:设一个flag=0,输入第一个数后,flag++,然后判断,flag为1时,只输出数,flag不为1时,既输出空行又输出数。
HDU 1004
然后是我写的代码,我觉得海星……
想说一个注意点,就是用while(cin>>n)的时候,如果在里面放了什么计数的之类,一定要记得初始化!!!!!!
#include<iostream>
#include<string>
using namespace std;
int main(){
int N;
string color[1000];
while(cin>>N){
int flag[1000]={};
int max=1,k=0;
if(N==0) return 0;
else{
cin>>color[0];
flag[0]++;
for(int i=1;i<N;i++){
cin>>color[i];
flag[i]++;
for(int j=0;j<i;j++){
if(color[i]==color[j]) flag[i]=flag[j]+1;
}
if(flag[i]>max){
max=flag[i];
k=i;
}
}
cout<<color[k]<<endl;
}
}
return 0;
}
这里面涉及到两个问题,书上有但我不会的,搜索出来的:
1.如何输出数组中最大的数的(值及其)下标?
也是假定一个max或者min,比较然后赋值就ok了。
2.将数组初始化为0:
- 全局数组
int arr[10]; //声明时不赋值,默认值为0 - 局部数组
int arr[10] = {}; - 指针
int* arr = new int [10];
for (int i = 0; i < 10; i ++) arr[i] = 0; //动态获取的内存,默认值undefined
第一次写还有点小激动呢!
希望以后的OJ题也是好好做,好好记笔记啦。
晚安。