洛谷T779196 模拟赛2 T1 互质划分(coprime)

T779196 模拟赛2 T1 互质划分(coprime)

题目描述

正整数 \(a\) 和 \(b\) 的最大公因数是满足 \(a,b\) 同时是 \(d\) 的倍数的最大的正整数 \(d\)。

而正整数 \(a\) 和 \(b\) 互质,指的是 \(a\) 和 \(b\) 的最大公因数为 \(1\)。

给定一个正整数 \(n\),求最少把 \(1\sim n\) 共 \(n\) 个正整数分成多少堆,才能使得每一堆里面每两个数都互质。

输入格式

一行一个正整数 \(n\)。

输出格式

一行一个整数表示最少的堆数。

输入输出样例 #1

输入 #1

2

输出 #1

1

输入输出样例 #2

输入 #2

5

输出 #2

2

说明/提示

样例 1 解释

一种合法方案是把 \(1,2\) 放在同一堆,则 \(1,2\) 的最大公因数是 \(1\),它们互质,所以满足要求。

样例 2 解释

一种合法方案是把 \(1,2,5\) 放在同一堆,\(3,4\) 放在同一堆,可以验证是满足要求的。

数据规模与约定

对于 \(50\%\) 的数据,\(1\leq n\leq 10\)。

对于 \(70\%\) 的数据,\(1\leq n\leq 10^3\)。

对于 \(100\%\) 的数据,\(1\leq n\leq 10^{18}\)。

其实很简单

因为1~n不是奇数就是偶数
而偶数都不是质数,无法互质
奇数有些是质数,有些是可以互质的
所以每个偶数都需要一个堆
而奇数随便选几个互质的塞进任意一个堆就可以了
所以答案是偶数的个数
注:n=1要特判,不然输出n/2就是0了,还有记得用long long防爆

ACcode:

#include<bits/stdc++.h>
using namespace std;
long long n; //数据是1e8不要忘记long long
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	if(n==1) cout<<1<<endl;
	else cout<<n/2<<endl; //直接手搓公式偷鸡(doge)
	return 0;
}
//Author:AAA_jiancaipifa
posted @ 2026-08-16 16:23  AAA_jiancaipifa  阅读(25)  评论(0)    收藏  举报