【GDKOI】2021普及Day3

【GDKOI】2021普及Day3

第一题 三角形相似

提交文件: triangle.cpp
输入文件: triangle.in
输出文件: triangle.out
时间空间限制: 1s, 512MB
你已经上初中了,相信你一定会做这道题。
给定两个三角形,问这两个三角形是否相似。
下面是可能有用的定义:
• 如果两个三角形的三个角分别对应相等,则这两个三角形相似。
输入格式
输入包含多组测试数据。
第一行一个整数 T,表示数据组数。
每组数据六行,每行两个整数 xi
, yi,表示一个顶点的坐标。其中 (x1, y1),(x2, y2),(x3, y3) 表示第一个三
角形的三个顶点,(x4, y4),(x5, y5),(x6, y6) 表示第二个三角形的三个顶点。
输出格式
输出 T 行,每行输出 YES 或 NO 表示两个三角形是否相似。
样例数据
triangle.in
2
0 0
0 1
1 0
1 1
0 1
1 0
0 0
0 1
1 0
2 2
2 0
1 0
triangle.out
YES
NO
样例解释
对于第一组数据:
第 2 页 共 7 页
GDKOI 2021 PJ Day3
对于第二组数据:
数据范围
对于 40% 的数据,|xi|, |yi
| ≤ 1000;
对于 100% 的数据,|xi|, |yi
| ≤ 109, 1 ≤ T ≤ 1000。 第 3 页 共 7 页
GDKOI 2021 PJ Day3

第二题 樱花再见

提交文件: sakura.cpp
输入文件: sakura.in
输出文件: sakura.out
时间空间限制: 1s, 512MB
毕业季,除了看学长学姐们穿着西装、礼服、漂亮裙子拍毕业照,跟老师朋友说笑告别,一起在纪念册
上留言,留下最后一份美好的回忆,没毕业的低年级小朋友还要关注一下自己的期末考试成绩。
小虾笼的班上共有 n 个学生,她共有 k 科考试,每一科老师打分是 0 到 100 之间的任意实数。成绩一科
一科地出,第 i 天会出第 i 科的成绩,小虾笼会知道她这一科在班上排名 ri。排名 r 意味着有 r 1 个同学
分数严格大于她的分数,同分的同学会有相同的排名。
尽管这是个不好的习惯,但小虾笼总是喜欢预测自己的最终排名,对于所有 1 ≤ i ≤ k,你要回答她前 i
科成绩的总和的排名最好和最坏分别是多少。
输入格式
第一行两个正整数 n, k,表示学生数、考试科数。
第二行 k 个正整数 r1, · · · , rk,表示每一科的排名。
输出格式
共 k 行,每行两个正整数,第 i 行的两个整数分别表示前 i 科成绩总和的最好排名、最坏排名。
样例数据
sakura.in
6 2
3 5
sakura.out
3 3
2 6
样例解释
出第 1 科成绩之后,因为只有 1 科成绩,所以总和的排名等于这一科的排名,都是 3;
出第 2 科成绩之后,可使小虾笼排名为 2 的一种成绩是
小虾笼 同学 1 同学 2 同学 3 同学 4 同学 5 第 1 科 85 90 92 83 81 80
第 2 科 78 70 81 80 80 79
总分 163 160 173 163 161 159
可使小虾笼排名为 6 的一种成绩是
小虾笼 同学 1 同学 2 同学 3 同学 4 同学 5 第 1 科 90 88 86 92 93 90
第 2 科 90 100 95 89 92 95
总分 180 188 181 181 185 185
不存在使得小虾笼排名为 1 的成绩。
数据范围
对于 20% 的数据,1 ≤ n, k ≤ 3,老师的给分只会是 20, 40, 60, 80, 100 这五种整数成绩;
第 4 页 共 7 页
GDKOI 2021 PJ Day3
对于 60% 的数据,1 ≤ n, k ≤ 10000;
对于 100% 的数据,1 ≤ n ≤ 109, 1 ≤ k ≤ 105,保证 1 ≤ ri ≤ n 。
本题有部分分,如果输出的最好排名和最坏排名仅有一种是完全正确的,则可以获得该数据点一半的分
数。因此为了选手得分最大化,建议无论如何都输出 k 行,每行两个整数。
第 5 页 共 7 页
GDKOI 2021 PJ Day3

第三题 数论

提交文件: number.cpp
输入文件: number.in
输出文件: number.out
时间空间限制: 1s, 512MB
定义数论函数 λ(n) 为:
• 设 n 的质因数分解为 n = ∏ pei i ,则 λ(n) = ( 1)
∑ei
比如 λ(4) = 1, λ(2) = 1, λ(1) = 1。
你的任务是求:
∑nk=1
∑i|k ∑j|i λ(i)λ(j)
输入格式
共一行,一个整数 n。
输出格式
共一行,一个整数,表示答案 对 998244353 取模 之后的结果。
样例数据
number.in number.out
10 13
100000 164038
10000000000 477285001
数据范围
对于 20% 的数据,n ≤ 100;
对于 60% 的数据,n ≤ 2 × 105;
对于所有的数据,n ≤ 1012。 第 6 页 共 7 页
GDKOI 2021 PJ Day3

第四题 好序列

提交文件: sequence.cpp
输入文件: sequence.in
输出文件: sequence.out
时间空间限制: 1s, 512MB
定义一个长度为 n 的序列 A 是好的,当且仅当对于任意的数 i(1 ≤ i ≤ n),A 序列前 i 个数的总和都大
于等于 A 序列后 i 个数的总和。
形式化地说,若记 lsumk = ∑ki=1
Ai
, rsumk = ∑n i=n k+1
Ai,则序列 A 是好的,当且仅当:
∀1 ≤ k ≤ n, lsumk ≥ rsumk
现给定一个数字 n,若限制 0 ≤ Ai ≤ n,请问共有多少个长度为 n 的好的序列 A 呢?
输入格式
共一行,一个整数 n。
输出格式
共一行,一个整数,表示答案对 998244353 取模 之后的结果。
样例数据
sequence.in sequence.out
2 6
4 290
样例解释
对于样例 1,(0, 0),(1, 0),(2, 0),(1, 1),(2, 1),(2, 0) 均为合法方案。
数据范围
对于 30% 的数据,n ≤ 10;
对于 50% 的数据,n ≤ 16;
对于 70% 的数据,n ≤ 50;
对于 100% 的数据,n ≤ 100;

代码

T1

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long gcd(long long a,long long b)
{
    
    
	long long r;
	for(r=a%b;r;a=b,b=r,r=a%b);
	return b;
}
int main()
{
    
    
	freopen("triangle.in","r",stdin);
	freopen("triangle.out","w",stdout);
	long long x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,T,tem,i;
	long long b1[4],b2[4];
	for(scanf("%lld",&T);T;T--)
	{
    
    
		scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4,&x5,&y5,&x6,&y6);
		b1[0]=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
		b1[1]=(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
		b1[2]=(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2);
		b2[0]=(x4-x5)*(x4-x5)+(y4-y5)*(y4-y5);
		b2[1]=(x4-x6)*(x4-x6)+(y4-y6)*(y4-y6);
		b2[2]=(x6-x5)*(x6-x5)+(y6-y5)*(y6-y5);
		sort(b1,b1+3);
		sort(b2,b2+3);
		for(i=0;i<3;i++)
		{
    
    
			tem=gcd(b1[i],b2[i]);
			b1[i]/=tem;
			b2[i]/=tem;
		}
		if(b1[0]==b1[1]&&b1[1]==b1[2]&&b2[0]==b2[1]&&b2[1]==b2[2])
			printf("YES\n");
		else
			printf("NO\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    
    
	freopen("sakura.in","r",stdin);
	freopen("sakura.out","w",stdout);
	long long n,k,r,good=0,bad=0;
	for(scanf("%lld%lld",&n,&k);k;k--)
	{
    
    
		scanf("%lld",&r);
		good+=n-r,bad+=r-1;
		printf("%lld %lld\n",max(n-good,(long long)(1)),min(bad+1,n));
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T3

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
    
    
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	long long n,i,ans=0;
	scanf("%lld",&n);
	for(i=1;i*i<=n;ans=(n/(i*i)%998244353+ans)%998244353,i++);
	printf("%lld",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T4

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const long long mods=998244353;
long long f[101][10001];
long long mydogabs(long long x)
{
    
    
	if(x<0)return -x;
	return x;
}
int main()
{
    
    
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	long long n,i,j,k,ans=0;
	scanf("%lld",&n);
	for(f[0][0]=1,i=1;i<=n>>1;i++)
		for(j=0;j<=i*n;j++)
			for(f[i][j]=0,k=max(j-n,(long long)(0));k<=j+n;k++)
				f[i][j]=(f[i][j]+(1ll*(n+1-mydogabs(j-k))%mods*f[i-1][k]%mods))%mods;
	for(i=0;i<=(n*n)>>1;ans=(ans+f[n>>1][i])%mods,i++);
	if(n&1)ans=(ans*(1ll*(n+1)%mods))%mods;
	printf("%lld",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46975572/article/details/115371883