7-2 Blah数集
分数 100
作者 谷方明
单位 吉林大学
大数学家高斯小时候偶然发现一种有趣的自然数集合Blah。以a为基的集合Ba定义如下:
a是集合Ba的基,且a是Ba的第一个元素;
若x在集合Ba中,则2x+1和3x+1也都在Ba中;
没有其它元素在集合Ba中。
现在小高斯想知道如果将集合Ba中元素按照升序排列,第n个元素会是多少?
输入格式:
多行,每行包括两个数,集合的基a(1<=a<=50))以及所求元素序号n(1<=n<=1000000)
输出格式:
对于每个输入,输出集合Ba的第n个元素值
输入样例:
在这里给出一组输入。例如:
1 5
25 100000
输出样例:
在这里给出相应的输出。例如:
9
34503679
#include <stdio.h>
long long x[1000000];
int main(void)
{
long long a = 0, b = 0, c = 1, n, i;
while (scanf("%lld %lld", &i, &n) != EOF)
{
x[0] = i;
a = 0;
b = 0;
for (c = 1; c <= n; c++)
{
if ((x[a] * 2 + 1 == x[b] * 3 + 1))
{
x[c] = x[a] * 2 + 1;
a++;
b++;
}
else if (x[a] * 2 + 1 < x[b] * 3 + 1)
{
x[c] = x[a] * 2 + 1;
a++;
}
else
{
x[c] = x[b] * 3 + 1;
b++;
}
}
printf("%lld\n", x[n-1]);
}
}
报数游戏
分数 100
作者 谷方明
单位 吉林大学
n个人围成一圈,从1开始依次编号,做报数游戏。 现指定从第1个人开始报数,报数到第m个人时,该人出圈,然后从其下一个人重新开始报数,仍是报数到第m个人出圈,如此重复下去,直到所有人都出圈。总人数不足m时将循环报数。请输出所有人出圈的顺序。
输入格式:
一行,两个整数n和m。n表示游戏的人数,m表示报数出圈的数字,1≤n≤50000,1≤m≤100.
输出格式:
一行,n个用空格分隔的整数,表示所有人出圈的顺序
输入样例:
在这里给出一组输入。例如:
5 2
输出样例:
在这里给出相应的输出。例如:
2 4 1 5 3
#include<stdio.h>
int x[50000][2];
int main()
{
int a, b, c=0, d=0,n,m;
scanf("%d %d", &n, &m);
for (a = 0; a < n; a++)
{
x[a][0] = 1;
x[a][1] = a + 1;
}
a--;
x[a][1] = 0;
for (a = 0; a < n; a++)
{
for (b = 1; b < m; b++)
{
d = c;
c = x[c][1];
}
printf("%d", c+1);
if (a != n - 1)
printf(" ");
c = x[c][1];
x[d][1] = c;
}
return 0;
}
查询子序列和
分数 100
作者 谷方明
单位 吉林大学
对N个整数的序列,查询子序列和∑
k=i
j
A
k
, (1≤i,j≤N).
输入格式:
第1行,两个整数:N和Q,表示整数的个数和查询的次数,1≤N≤100000,0≤Q≤100000.
第2行,N个用空格分开的整数 x , │x│≤20000.
第3至Q+2行,每行两个整数i和j,表示所求子序列和的区间[i,j],1≤i≤j≤N,保证所有区间都合法。
输出格式:
Q行,每行一个整数,表示相应子序列的和
输入样例:
5 3
1 2 3 4 5
1 5
2 4
3 5
输出样例:
在这里给出相应的输出。例如:
15
9
12
#include <stdio.h>
int x[100010];
int main()
{
int n, q, a, b, c,s=0,i,j;
scanf("%d %d", &n, &q);
for (a = 1; a <= n; a++)
{
scanf("%d", &i);
s += i;
x[a] = s;
}
for (a = 1; a <= q; a++)
{
scanf("%d %d", &i, &j);
printf("%d\n", x[j] - x[i-1]);
}
return 0;
}
等价性问题
分数 100
作者 谷方明
单位 吉林大学
等价性问题就是:给定集合S及其上的若干等价元素对,询问S上的两个元素是否等价。常见的等价性问题有亲戚关系等。等价性问题的一种模型是等价关系和等价类。
输入格式:
输入由两部分组成。
第一部分以N,M开始。N为问题涉及的元素个数,元素的编号为1,2,3,…, N。M表示等价元素对个数,1<=N,M<=100000,接下来M行,每行有两个元素ai和bi,表示ai和bi等价。
第二部分以一个整数P(1<=P<=100000)开始,表示有P次询问,接下来P行,每行有两个元素ci和di,表示询问ci和di是否等价。
输出格式:
若干行。每行表示一个询问的结果。若ci和di等价,则输出“Yes”,否则输出“No”。
输入样例:
在这里给出一组输入。例如:
6 4
1 2
1 3
5 4
5 3
3
1 4
2 3
5 6
输出样例:
在这里给出相应的输出。例如:
Yes
Yes
No
#include <stdio.h>
int x[100010];
int y[100010];
int find(int v)
{
if (x[v] == v) return v;
int b = 0, c ;
while (x[v] != v)
{
y[b] = v;
v = x[v];
b++;
}
for (c=0; c< b; c++)
x[y[c]] = v;
return v;
}
int main()
{
int a, b, c, d, n, m, q, i, j;
scanf("%d %d", &n, &m);
for (a = 1; a <= n; a++)
x[a] = a;
for (a = 1; a <= m; a++)
{
scanf("%d %d", &i, &j);
b = find(i);
c = find(j);
x[b] = c;
}
scanf("%d", &q);
for (a = 1; a <= q; a++)
{
scanf("%d %d", &i, &j);
b = find(i);
c = find(j);
if (c == b)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}