A - 素数判定
判断满足
c∈(x,y)且c∈Z
,时
f(c)
的素性,其中
f(x)=x2+x+41
.
很简单不解释…。用筛法可以节省时间,很明显
maxc<50∗50+50+41<2600
#include <cstdio>
int nprim[5000]={0};
int main(){
int t,x,y,flag;
nprim[1]=1;
for(int i=2;i<5000;i++){
if(!nprim[i]){
for(int j=i+i;j<5000;j+=i)nprim[j]=1;
}
}
while(~scanf("%d%d",&x,&y)&&(x||y)){
flag=1;
for(int i=x+1;i<y&&flag;i++){
t=i*i+i+41;
if(nprim[t])flag=0;
}
if(flag)printf("OK\n");
else printf("Sorry\n");
}
}
B - 单词数
每一行是单独一组数据,找出每组数据的相异单词数目,保证单词只含小写。
有几个地方是疏忽容易导致错误的地方:①每行一组数据;②单词之间可能不止一个空格;③相同单词不重复计数。
#include <cstdio>
#include <set>
#include <iostream>
#include <string>
using namespace std;
char l[500000];
set<string> s;
int main(){
string te;int f=0;
gets(l);
for(;l[0]!='#';gets(l)){
te="";
for(int t=0,i=0;l[i];i++){
if('a'<=l[i]&&l[i]<='z'){
l[i]++;
te+=l[i];
t=1;
}
if(t&&(l[i]>'z'||l[i]<'a')){
if(te!="")s.insert(te);
te="";
t=0;
}
}
if(te!="")s.insert(te);
cout<<s.size()<<endl;
s.clear();
}
}
C - 超级楼梯
看到这个标题就应该知道是fibonacci的…好吧,就是裸题…
通过记忆化数据可以缩短用时。
#include <cstdio>
int f[50];
int main(){
f[0]=0;f[1]=1;
for(int i=2;i<41;i++)f[i]=f[i-1]+f[i-2];
int n,t;scanf("%d",&n);
while(n--){
scanf("%d",&t);
printf("%d\n",f[t]);
}
}
D - 空心三角形
考字符串,需要注意最后一个三角形后面有换行(虽然sample out没有换行…)
#include <cstdio>
char a[10];
int main(){
int n,f=0;char x;
while(~scanf("%s",a)){
if(a[0]=='@')break;
scanf("%d",&n);
x=a[0];
if(f)printf("\n");else f=1;
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
if(n-i==j)printf("%c",x);
else printf(" ");
}
for(int j=n-2;j+1;j--){
if(i==1)continue;
if(n-i==j){
printf("%c",x);
break;
}
printf(" ");
}
printf("\n");
}
for(int i=1;i<2*n;i++)printf("%c",x);
printf("\n");
}
}
E - Let the Balloon Rise
用map计数找出出现次数最多的字符串
#include <iostream>
#include <map>
#include <string>
using namespace std;
map<string,int> m;
int main(){
ios::sync_with_stdio(false);
string x,anss;
int n,ans;
while(cin>>n){
ans=0;
while(n--){
cin>>x;
m[x]++;
if(m[x]>ans)ans=m[x],anss=x;
}
cout<<anss<<endl;
m.clear();
}
}
F - A+B Again
标准做法?!:
#include <cstdio>
int main(){
long long a,b;
while(scanf("%llX%llX",&a,&b)){
if(a+b<0)printf("-%llX\n",-a-b);
else printf("%llX\n",a+b);
}
}
然而如果是模拟的话,则需要注意几点:
①+0+−0=0
②(0xFFFFFFFFFFFFFFF)16=(1152921504606847046)10>INT_MAX
③没有前导零,如果为正“+"需要省去
#include <cstdio>
typedef long long ll;
using namespace std;
char x[20],y[20],a[50],dic[]="0123456789ABCDEF";
int fs,l;
ll t(char* x){
int f=1;ll ans=0;
if(*x=='-')f=-1,x++;
else if(*x=='+')x++;
while(*x){
if(*x>='A')ans=ans*16+*x-'A'+10;
else ans=ans*16+*x-'0';
x++;
}
return f*ans;
}
void dt(ll x){
l=0;
if(x==0)a[0]='0',a[1]=0,l=1;
else {
if(x<0)x=-x,fs=-1;else fs=1;
while(x){
a[l++]=dic[x%16];
x/=16;
}
}
}
int main(){
while(scanf("%s%s",x,y)!=EOF){
dt(t(x)+t(y));
if(fs==-1&&!(a[0]=='0'&&l==1))printf("-");
for(int i=l-1;i+1;i--)printf("%c",a[i]);
printf("\n");
}
}
G - A1=?
在纸上画了半天,最终能得到一个只剩下 A0 , An+1 和 Ci 的式子..
#include <cstdio>
int main(){
int n;double a,b,c,ans;
while(~scanf("%d",&n)){
scanf("%lf%lf",&a,&b);
ans=n*a+b;
for(int i=0;i<n;i++){
scanf("%lf",&c);
ans-=2*(n-i)*c;
}
printf("%.2lf\n",ans/(n+1));
}
}
H - 相遇周期
求分数的最小公倍数…
其实这道题我一开始是这样求的:
输入数据实际是转速(圈/天)设为V1=x1x2,V2=y1y2,则:T=1|V1−V2|=1|x1x2−y1y2|=|x2y2||x1y2−x2y1|
事实上是:
Let b=x2y2,then x1→x′1, y1→y′1so a=x′1+y′1,ans=ab
#include <cstdio>
typedef long long ll;
ll gcd(ll x,ll y){
ll r;
while(y){r=x%y;x=y;y=r;}
return x;
}
int main(){
int n;ll a1,a2,b1,b2,b,t,t1,t2;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld/%lld %lld/%lld",&a1,&a2,&b1,&b2);
t1=a1*b2;t2=a2*b1;b=a2*b2;
if((t=t1/gcd(t1,t2)*t2)%b==0)printf("%lld\n",t/b);
else {
t1=gcd(t,b);
printf("%lld/%lld\n",t/t1,b/t1);
}
}
}