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;
}

完结撒花~~

posted @ 2024-01-07 19:30  SunsetLake  阅读(10)  评论(0编辑  收藏  举报
-->