Description
有一天 ��kk 拿到了一个长度为 �(2≤�≤106)n(2≤n≤106) 的序列,该序列为全排列( 1−�1−n 之间的数字恰好仅出现一次,包括 11 和 �n)。现在 ��kk 想知道这个序列中能构成的最大的 ���(�,�)(1≤�<�≤�)gcd(a,b)(1≤a<b≤n)
关于 ���gcd : 两个正整数 �a 和 �b 的最大公约数 ���(�,�)gcd(a,b) 是作为 �a 和 �b 的除数的最大整数。
Format
Input
第一行输入 �(1≤�≤1000)t(1≤t≤1000),表示 �t 组数据。
接下来 �t 行,每行输入一个正整数 �(2≤�≤106)n(2≤n≤106),代表序列长度。
Output
输出 �t 行,对于每一行为该序列的最大 ���gcd 值。
Samples
输入数据 1
2
5
3
Copy
输出数据 1
2
1
Copy
样例解释
在第一个样例中,22 是可能的最大值,对应的是 ���(2,4)=2gcd(2,4)=2。
在第二个样例中,���(1,2)=���(2,3)=���(1,3)=1gcd(1,2)=gcd(2,3)=gcd(1,3)=1。
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
int b[200005];//存放结果
for(int i = 0;i < t;i++){
int n;
int co_2 = 0;
cin>>n;
int a[200005];//存放每组的最大公约数
int co = 0;
for(int i = 1;i <= n/2;i++){
int x = min(i,n+1-i);
while(x>1 && (i%x!=0 || (n+1-i)%x!=0)){
x--;}
a[co] = x;
co ++;
}
int max=0;
for(int i = 0;i < co;i++) {
if(a[i]>a[max]){
max = i;
}
}
b[co_2] = a[max];
co_2++;
}
for(int i = 0;i < t;i++){
printf("%d\n",b[i]+1);
}
return 0;
}
我的代码是按照他一步一步来的,结果超时。。
下面是标准答案:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int t;
cin>>t;
while(t--){
int x;
cin>>x;
cout<<x/2<<"\n";
}
return 0;
}
很牛逼啊,还算是要多找规律。