一时兴起,打了个 (Div3) ,果然是老年退役选手, (Div3) 只能切前三题了。只能说,道阻且长啊。
(A) (Dislike) (of) (Threes)
解法
从 (1) 开始枚举正整数,筛掉满足 (x equiv 3 (mod 10)) 和 (x equiv 0 (mod 3)) 的正整数 (x) ,筛出 (1000) 个即可。
(Code)
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ret=(ret<<1)+(ret<<3)+ch-'0';
ch=getchar();
}
return ret*f;
}
int t,k,num,a[1005];
int main()
{
t=read();
for(register int i=1;i<=5000;i++)
{
if(i%3==0||i%10==3)
continue;
num++;
a[num]=i;
if(num==1000)
break;
}
for(register int i=1;i<=t;i++)
{
k=read();
printf("%d
",a[k]);
}
return 0;
}
(B) (Who's) (Opposite?)
解法
(2|a-b|) 为环长(记为 (2r) )。设答案为 (d) ,则合法的 (d=d+r) 或 (d=d-r) 且 (d) 在 ([1,2n](d in N_+)) 之间。
(Code)
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ret=(ret<<1)+(ret<<3)+ch-'0';
ch=getchar();
}
return ret*f;
}
int t,a,b,c,d,r;
int main()
{
t=read();
for(register int i=1;i<=t;i++)
{
a=read();
b=read();
c=read();
r=abs(a-b);
if(a>2*r||b>2*r||c>2*r)
{
printf("-1
");
continue;
}
d=c-r;
if(d>0&&d<=2*r)
{
printf("%d
",d);
continue;
}
d=c+r;
if(d>0&&d<=2*r)
{
printf("%d
",d);
continue;
}
printf("-1
");
}
return 0;
}
(C) (Infinity) (Table)
解法
考虑把 (k)拆成 (a^2+b(a,b in N,b in [0,2a])) 的形式。 (b leqslant a+1) 时, (k) 在 ((b,a+1)) ; (b>a+1) 时, (k) 在 ((a+1,2a-b+2)) 。
(Code)
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ret=(ret<<1)+(ret<<3)+ch-'0';
ch=getchar();
}
return ret*f;
}
int t,k,a,b,r,c,x[40005];
int main()
{
t=read();
for(register int i=1;i<=40000;i++)
x[i]=i*i;
for(register int i=1;i<=t;i++)
{
k=read();
if(k==2)
{
printf("1 2
");
continue;
}
if(k==3)
{
printf("2 2
");
continue;
}
for(register int j=1;j<=40000;j++)
{
if(k<x[j])
{
a=j-1;
break;
}
}
b=k-x[a];
if(b==0)
{
printf("%d %d
",a,1);
continue;
}
if(b<=a+1)
{
r=b;
c=a+1;
}
else
{
r=a+1;
c=2*a+2-b;
}
printf("%d %d
",r,c);
}
return 0;
}
未完待续