P8284
思路
在比赛的时候,第一眼看过去就觉得是道诈骗题(实际上确实是诈骗题),花了十分钟写完,一交,90分。。。调了半天也没调出来,最后仔细审了一遍题豁然开朗,现在,就让我们一起来审一审题。
- 对于每个 \(i\;(1 \leq i \leq n-1)\),满足\(a_i=\gcd(a_{i+1},a_{i+2},\dots,a_{n-1},a_n)\)
这个条件非常关键,我们从小的开始分析。如果要满足这个条件,那么 \(a_{n-1}=\gcd(a_n)\)。我们又知道一个数的最大公约数就是他本身,所以 \(a_{n-1}=\gcd(a_n)=a_n\)。\(a_{n-2},a_{n-3},\dots,a_2,a_1\) 同理都等于 \(a_n\)。于是乎,我们得到了一个结论:这个序列中的数全部相等。现在,你们知道该怎么做了么?因为题目中有说 :
- 对于每个 \(i\;(1 \leq i \leq 10^5)\),\(a_i\) 至多在序列中出现 \(k\) 次。
所以只要满足 \(k \geq n\) 这个条件,一定存在无数多个解,否则无解。怎么样,是不是道诈骗题?
代码
#include<bits/stdc++.h>
using namespace std;
long long t,n,k,num;
int main(){
cin>>t;
while(t--){
cin>>n>>k;
if(k>=n){//满足条件
puts("5 or more");
for(int i=1;i<=5;++i){
for(int j=1;j<=n;++j){
cout<<i<<" ";//输出字典序最小的五种解,也就是1,2,3,4,5
}
puts("");
}
continue;
}
else puts("Impossible");//否则无解
}
return 0;
}
完结撒花~~