记录洛谷刷题QAQ
一、询问
题目背景
zbw 被邀请至幼儿园给小朋友们出题。
题目描述
现在 zbw 有
n
n
n 个物品,编号从
1
~
n
1 \sim n
1~n,他会告诉你
m
m
m 个条件,每个条件包含两个数
x
,
y
x,y
x,y,表示第
x
x
x 个物品和第
y
y
y 个物品是相同的。
因为 zbw 特别赶时间,所以他保证每次给出的条件都是有用的,也就是说,每次给出的条件无法由之前的条件推导得来。
你需要回答有多少种不同的物品。
输入格式
第一行两个整数
n
n
n,
m
m
m。
之后
m
m
m 行,每行两个数
x
,
y
x,y
x,y,表示第
x
x
x 个物品和第
y
y
y 个物品是相同的。
输出格式
一个整数,不同物品的数量。
样例 #1
样例输入 #1
11 8
1 2
4 3
5 4
1 3
5 6
7 10
5 10
8 9
样例输出 #1
3
提示
对于
20
%
20\%
20% 的数据,
n
,
m
≤
10
n,m \le 10
n,m≤10。
对于
40
%
40\%
40% 的数据,
n
,
m
≤
1
0
3
n,m \le 10^3
n,m≤103。
对于
60
%
60\%
60% 的数据,
n
,
m
≤
1
0
5
n,m \le 10^5
n,m≤105。
对于
80
%
80\%
80% 的数据,
m
≤
1
0
6
m \le 10^6
m≤106。
对于
100
%
100\%
100% 的数据,
1
≤
n
≤
1
0
18
1 \le n \le 10^{18}
1≤n≤1018,
1
≤
m
≤
1
0
7
1 \le m \le 10^7
1≤m≤107。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
long long n, m;
scanf("%lld%lld",&n,&m);
printf("%lld\n",n - m);
}
二、[Cnoi2020]光图
题目背景
简洁中蕴含着伟大。
Cirno 不经意地把一个内部完全反射的圆分成了
12
12
12 等分,等分点分别记作
A
0
A_0
A0?,
A
1
A_1
A1?,
A
2
A_2
A2?,
?
\cdots
? ,
A
11
A_{11}
A11?。
随后,她不经意地将一束光从一点发出,朝向另一点,重复,反射,迭代,便得到了一幅美妙的光图。
这一切都发生在不经意之间。
她不经意地发现了这一幕,并且不经意地记下了这个不经意的结论,又在某一刻不经意地回忆起。
幻想乡的每一天一切都是这么不以为意,多好的一天啊!
题目描述
Rumia 有一个单位圆,被分成
n
n
n 等分,等分点分别记作
A
0
A_0
A0?,
A
1
A_1
A1?,
A
2
A_2
A2?,
?
\cdots
? ,
A
n
?
1
A_{n-1}
An?1?。
现在她从
A
0
A_0
A0? 向
A
p
A_p
Ap? 发射一束光,经过
k
k
k 次反射,到达了
A
t
A_t
At?。
Rumia 想知道
t
t
t 的值,由于 Cirno 并不想帮她,所以 Rumia 转而求助于你。
输入格式
一行,三个整数,
n
,
p
,
k
n,p,k
n,p,k。
输出格式
一行,一个整数
t
t
t。
样例 #1
样例输入 #1
12 5 2
样例输出 #1
10
样例 #2
样例输入 #2
1000 342 3472844
样例输出 #2
648
提示
Sample1 解释
后置物理知识
- 连续曲线反射规律 : 入射光线与出射光线关于入射点在曲线上切线夹角相等。
数据范围约定
「本题采用捆绑测试」
- Subtask1(
80
%
80\%
80% ) :
n
,
k
≤
1
0
6
n, k \le 10^6
n,k≤106
- Subtask2(
20
%
20\%
20% ) :
n
,
k
≤
1
0
9
n, k \le 10^9
n,k≤109
对于
100
%
100\%
100% 的数据 :
0
<
p
<
n
≤
1
0
9
0 < p < n \le 10^9
0<p<n≤109,
0
<
k
≤
1
0
9
0 < k \le 10^9
0<k≤109。
后记
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
long long n, p, k;
scanf("%lld%lld%lld",&n,&p,&k);
long long num = (p*k)%n;
printf("%lld\n",num);
}
三、[EER1]苏联人
题目背景
题目名称是吸引你点进来的。
这是一道正常的题,和苏联没有任何关系。
题目描述
你在打 EE Round 1,发现第一题非常无聊。于是你不打了,去下国际象棋了。
结果你发现,由于神秘力量的影响,你的棋子只剩下若干黑色的战车,若干黑色的主教和一只白色的国王了。
由于你很无聊,所以你把一些黑色棋子放在了
8
×
8
8\times 8
8×8 的棋盘上。
由于你很无聊,所以你想知道,国王放在哪些格子是安全的。换句话说,有哪些格子不会被战车和主教攻击到。当然,国王不能放在已经有棋子的地方。
为了防止你无聊透顶而不知道国际象棋的规则,这里给出以下提示(如果你知道规则那么可以跳过):
国际象棋中,战车可以横向、竖向移动,且格数不受限制。但不能越过其他棋子。
如图,黄色的格子为战车能走到(攻击到)的格子。
国际象棋中,主教可以斜向移动,且格数不受限制。但不能越过其他棋子。
如图,黄色的格子为主教能走到(攻击到)的格子。
简单来说,如果当前位置到目标位置的直线上存在其他棋子,则可以称为“越过了其他棋子”。
如果目标位置是对方的棋子,那么移动到目标位置后,对方的棋子会被吃掉。
更进一步地,你要找的所有位置,必须满足没有黑色棋子能一步走到。
如果你还是没有读懂,可以结合样例进行理解。
输入格式
共
8
8
8 行,每行
8
8
8 个字符,表示棋盘的状态。
其中 . 表示空位,R 表示战车,B 表示主教。
输出格式
共
8
8
8 行,每行
8
8
8 个字符。若一个格子是可以放国王的,则输出 1 ,否则输出 0 。
样例 #1
样例输入 #1
........
........
........
..B..R..
........
........
........
........
样例输出 #1
11111011
01110011
10101011
11000000
10101011
01110011
11111011
11111001
提示
对于
100
%
100\%
100% 的数据,保证只会出现 . ,R ,B 三种字符。
本题共有
4
4
4 个子任务,每个子任务的限制如下:
子任务
1
1
1(
10
10
10 分):保证只会出现 . 。
子任务
2
2
2(
20
20
20 分):保证只会出现一个 R 或一个 B (不同时出现)。
子任务
3
3
3(
30
30
30 分):保证只有一个 . 。
子任务
4
4
4(
40
40
40 分):没有特殊限制。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
char ch[8][8];
int ans[8][8];
int main()
{
for(int i=0;i<8;i++) scanf("%s",ch[i]);
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(ch[i][j]=='R')
{
ans[i][j]=1;
for(int k=i-1;k>=0 && ch[k][j]=='.';k--) ans[k][j]=1;
for(int k=i+1;k<8 && ch[k][j]=='.';k++) ans[k][j]=1;
for(int k=j-1;k>=0 && ch[i][k]=='.';k--) ans[i][k]=1;
for(int k=j+1;k<8 && ch[i][k]=='.';k++) ans[i][k]=1;
}
else if(ch[i][j]=='B')
{
ans[i][j]=1;
for(int k=i-1,l=j-1;k>=0 && l>=0 && ch[k][l]=='.';k--,l--) ans[k][l]=1;
for(int k=i+1,l=j+1;k<8 && l<8 && ch[k][l]=='.';k++,l++) ans[k][l]=1;
for(int k=i-1,l=j+1;k>=0 && l<8 && ch[k][l]=='.';k--,l++) ans[k][l]=1;
for(int k=i+1,l=j-1;k<8 && l>=0 && ch[k][l]=='.';k++,l--) ans[k][l]=1;
}
}
}
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++) printf("%d",!ans[i][j]);
puts("");
}
return 0;
}
四、[USACO06OCT] Another Cow Number Game G
题目描述
奶牛们在玩一种数字游戏,Bessie 想让你帮她预测一下结果。游戏开始时,Bessie 将得到一个正整数
N
N
N。此时她的分数为
0
0
0。
奶牛们按照以下规则对
N
N
N 进行变换:
- 如果
N
N
N 是奇数,那么将它乘以
3
3
3 后再加
1
1
1。
- 如果
N
N
N 是偶数,那么将它除以
2
2
2。
数字每变换一次,Bessie 就得到
1
1
1 分。当
N
=
1
N=1
N=1 时,游戏结束。此时的分数就是她的最终得分。
输入格式
一行,一个整数
N
N
N。
输出格式
一行,一个整数,为 Bessie 的最终得分。
样例 #1
样例输入 #1
5
样例输出 #1
5
提示
【数据范围】
对于
100
%
100\%
100% 的数据,
1
≤
N
≤
1
0
6
1\le N\le 10^6
1≤N≤106。
【样例说明】
当
N
N
N 的初始值为
5
5
5 时,游戏的过程如下:
N
N
N | 变换后的数字 | 变换过程 | 总分 |
---|
5
5
5 |
16
16
16 |
3
×
5
+
1
3\times 5+1
3×5+1 |
1
1
1 |
16
16
16 |
8
8
8 |
16
÷
2
16\div 2
16÷2 |
2
2
2 |
8
8
8 |
4
4
4 |
8
÷
2
8\div 2
8÷2 |
3
3
3 |
4
4
4 |
2
2
2 |
4
÷
2
4\div 2
4÷2 |
4
4
4 |
2
2
2 |
1
1
1 |
2
÷
2
2\div 2
2÷2 |
5
5
5 |
Bessie 的最终得分为
5
5
5。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
long long n;
scanf("%lld",&n);
long long sum = 0;
while(n != 1)
{
if(n %2 == 0)
{
n = n/2;
sum++;
}
else if(n%2 != 0)
{
n = 3*n +1;
sum++;
}
}
printf("%lld\n",sum);
}
五、[COCI2014-2015#3] STROJOPIS
题目描述
正确的打字正成为文化的重要组成部分。如果你仍然没有使用所有的十根手指来打字,你必须重新学习打字——然后你会打字更快,感觉更舒适和愉快。
有很多网站教你正确打字。下图描述了基本原理:用同一个指针按所需的键是同一颜色的。黄色键需要用小指按下,蓝色键需要用无名指,绿色键需要用中指,红色键需要用食指。自然,左手按键盘的左侧(从 5 、T 、G 、B 开始向左的键),右手按右侧(从 6 、Y 、H 、N 开始向右的键),拇指负责空格。
您的任务是输出每根手指(拇指除外)正确输入给定字符串的分别按下的次数。
输入格式
仅一行一个字符串
s
s
s。字符串不包含空格,只包含上面图像中包含的字符。
输出格式
输出必须由八行组成,每行一个整数,表示从左到右观察到的每个手指的按键次数(拇指除外)。
样例 #1
样例输入 #1
AON=BOO;
样例输出 #1
1
0
0
1
1
0
3
2
样例 #2
样例输入 #2
PRINT'NY'[NASLA]
样例输出 #2
2
1
0
2
4
1
1
5
样例 #3
样例输入 #3
VIDI,KO,JE,DOSA
样例输出 #3
1
1
3
1
1
6
2
0
提示
数据规模与约定
令
∣
s
∣
|s|
∣s∣ 表示输入字符串的长度,则对于
100
%
100\%
100% 的数据,有
1
≤
∣
s
∣
≤
50
1\le |s|\le 50
1≤∣s∣≤50。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int a[10];
int main()
{
char str[51];
scanf("%s",&str);
int len = strlen(str);
for(int i = 0;i < len;i++)
{
if(str[i]=='1' || str[i]=='Q' || str[i]=='A' || str[i]=='Z')
a[1]++;
if(str[i]=='2' || str[i]=='W' || str[i]=='S' || str[i]=='X')
a[2]++;
if(str[i]=='3' || str[i]=='E' || str[i]=='D' || str[i]=='C')
a[3]++;
if(str[i]=='4' || str[i]=='R' || str[i]=='F' || str[i]=='V' || str[i]=='5' || str[i]=='T' || str[i]=='G' || str[i]=='B')
a[4]++;
if(str[i]=='6' || str[i]=='Y' || str[i]=='H' || str[i]=='N' || str[i]=='7' || str[i]=='U' || str[i]=='J' || str[i]=='M')
a[5]++;
if(str[i]=='8' || str[i]=='I' || str[i]=='K' || str[i]==',')
a[6]++;
if(str[i]=='9' || str[i]=='O' || str[i]=='L' || str[i]=='.')
a[7]++;
if(str[i]=='0' || str[i]=='P' || str[i]==';' || str[i]=='/' || str[i]=='-' || str[i]=='[' || str[i]==']' || str[i]=='=' || str[i]=='\'')
a[8]++;
}
for(int i = 1;i <= 8;i++)
printf("%d\n",a[i]);
return 0;
}
|