随笔—邀请赛前练—CodeForces 588B
Posted Shawn_Ji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随笔—邀请赛前练—CodeForces 588B相关的知识,希望对你有一定的参考价值。
题意:给一个数,求最大的一个因子,这个因子还要满足不能有平方数是他的因子。
我的解法几乎是暴力的,应该可以用数学的方法不暴力(或者说不那么“暴力”)求出来。
我的解法是:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<set> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define ABS(x) ((x)>0?(x):-(x)) const long long inf = 0x7fffffff; const long long N=1000000+10; long long a[N]; bool check(long long x) { for(long long i=2; i*i<=x; i++){ if(x%(i*i) ==0){ return 0; } } return 1; } int main() { long long n; cin>>n; long long p=0; for(long long i=1; i*i<=n; i++){ // cout<<i<<endl; if(n%i == 0){ a[p++]=i; a[p++]=n/i; } } sort(a,a+p); for(long long i=p-1; i>=0; i--){ if( check(a[i])){ printf("%I64d\\n",a[i]); break; } }
后来在网上学习了质因子分解的解法。 思路是从2开始,一个个试因子,并且把n中的i因子抽离干,进行到n==1或者i*i>n 。
代码
#include<iostream> using namespace std; int main() { long long n; cin>>n; long long ans=1; for(long long i=2; i*i<=n; i++){ if(n==1) break; if(n%i == 0) ans *= i; while(n%i == 0){ n /= i; } } cout<<ans*n<<endl; return 0; }
以上是关于随笔—邀请赛前练—CodeForces 588B的主要内容,如果未能解决你的问题,请参考以下文章
随笔—邀请赛前训—Codeforces Round #328 (Div. 2) A. PawnChess
随笔—邀请赛前训—Codeforces Round #327 (Div. 2) Rebranding