ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1372B - Omkar and Last Class of Math(贪心+数学规律+数论+*1300)

2021-10-14 16:31:26  阅读:211  来源: 互联网

标签:1300 cout LL Omkar Last 因数 ans CF1372B WIDA


CF1372B - Omkar and Last Class of Math(源地址自⇔CF1372B

Problem

uTools_1634199823756.png

Example

3
4
6
9
2 2
3 3
3 6

8f5bf11d558b749348cba1d56f3de335.png

tag:

⇔贪心、⇔数学规律、⇔数论、⇔*1300

题意:

将题目给定的 \(c\) 拆分成 \(a+b=c\),求出使得 \(LCM(a,b)\) 最大的 \(a\) 与 \(b\)。

思路:

暴力打表寻找规律,发现对于偶数 \(n\),答案恒为 cout<<n/2<<" "<<n/2<<endl; (最大的 \(LCM(a,b)\) 即为 \(\frac{n}{2}\));对于奇数 \(n\),答案恒为 \(n\) 最小的因数 \(x\) 与 \(n-x\) ,即 cout<<divi(n)<<" "<<n-divi(n)<<endl;

证明不详。

AC代码:

//A WIDA Project
#include<bits/stdc++.h>
using namespace std;
#define LL			long long
//===============================================================
LL T,ans,n;
//===============================================================
LL divi(LL n){
	for(LL i=2;i*i<=n;i++){
		if(n%i==0){
			ans=i;
			return ans;
		}
	}
	return 0;
}
int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
	cin>>T;
	while(T-->0){
		ans=0;
		cin>>n;
		if(n%2==0) cout<<n/2<<" "<<n/2<<endl;
		else{
			ans=divi(n);
			if(ans==0) cout<<1<<" "<<n-1<<endl;
			else cout<<n/ans<<" "<<n-n/ans<<endl;
		}
	}
	return 0;
}

错误次数:2次

原因:分解因数没有优化到 \(O(\sqrt{n})\) ,导致超时。

原因:未考虑给定的数字是质数的情况(最小因数为1,这种情况代码中ans=0),导致除以0的情况发生,RE一次。


文 / WIDA
2021.10.14成文
首发于WIDA个人博客,仅供学习讨论


更新日记:
2021.10.14 成文

标签:1300,cout,LL,Omkar,Last,因数,ans,CF1372B,WIDA
来源: https://www.cnblogs.com/WIDA/p/15407245.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有