洛谷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  阅读(4)  评论(0)    收藏  举报