1097 矩阵行平移
分数 20
作者 陈越
单位 浙江大学
给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的奇数行的元素整体向右依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一列元素的和。
输入格式:
输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。
接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。
输出格式:
在一行中输出平移后第 1 到 n 列元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22输出样例:
529 481 479 263 417 342 343样例解读
需要平移的是第 1、3、5、7 行。给定 k=2,应该将这三列顺次整体向右平移 1、2、1、2 位(如果有更多行,就应该按照 1、2、1、2、1、2 …… 这个规律顺次向右平移),左端的空位用 99 来填充。平移后的矩阵变成:
99 11 87 23 67 20 75 37 94 27 91 63 50 11 99 99 44 38 50 26 40 73 85 63 28 62 18 68 99 15 83 27 97 88 25 23 78 98 20 30 81 99 99 99 77 36 48 59 25
n,k,x=list(map(int,input().split()))
arr=[]
for _ in range(n):
t=list(map(int,input().split()))
arr.append(t)
m=1
for i in range(0,n,2):
for j in range(m):
arr[i].insert(0,x)
m+=1
if m>k:
m=1
brr=[0]*n
for j in range(n):
s=0
for p in range(n):
brr[j]+=arr[p][j]
for i in range(n):
if i+1==n:
print(brr[i],end='')
else:
print(brr[i],end=' ')
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出
Yes,否则输出No。输入样例:
3 18 29 40输出样例:
Yes No Yes
#include<iostream>
#include<vector>
using namespace std;
bool isBeautiful(int N) {
// 1. 找出所有因数
vector<int> factors;
for (int i = 1; i <= N; i++) {
if (N % i == 0) {
factors.push_back(i);
}
}
int size = factors.size();
// 2. 四重循环枚举不同的四个因数
for (int a = 0; a < size; a++) {
for (int b = a + 1; b < size; b++) {
for (int c = b + 1; c < size; c++) {
for (int d = c + 1; d < size; d++) {
// 使用long long防止溢出
long long sum = (long long)factors[a] + factors[b] + factors[c] + factors[d];
if (sum % N == 0) {
return true;
}
}
}
}
}
return false;
}
int main() {
int K;
cin >> K;
for (int i = 0; i < K; i++) {
int num;
cin >> num;
if (isBeautiful(num)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
1094 谷歌的招聘
分数 20
作者 陈越
单位 浙江大学
2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。
自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921... 其中粗体标出的 10 位数就是答案。
本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。
输入格式:
输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。
输出格式:
在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出
404。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。输入样例 1:
20 5 23654987725541023819输出样例 1:
49877输入样例 2:
10 3 2468001680输出样例 2:
404
#include<iostream>
#include<string>
#include<vector>
using namespace std;
bool is_prime(int a) {
if (a < 2) {
return false;
}
else if (a == 2) {
return true;
}
else if (a % 2 == 0) {
return false;
}
else {
for (int i = 3; i * i <= a; i++) {
if (a % i == 0) {
return false;
}
}
return true;
}
}
int main() {
int n, m;
cin >> n >> m;
string s;
cin >> s;
int f = false;
for (int i = 0; i <= n - m; i++) {
string t = s.substr(i, m);
if (is_prime(stoi(t))) {
cout << t << endl;
f = true;
break;
}
}
if (f == false) {
cout << "404" << endl;
}
return 0;
}

407

被折叠的 条评论
为什么被折叠?



