題目鏈接:https://ac.nowcoder.com/acm/contest/4784/B
題目描述
解析
一開始真的就是去求階乘,發現即使n很小,n!也可以很大。然後我以爲把n!控制在long long int數據內就可以了,發現這樣也是不行的。那應該怎麼辦呢?
其實對於兩個數a,b,如果a是b的倍數,那麼a質因子中一定包含b的所有質因子。所以這道題就可以將p約去與1~n這n個整數所有的質因子,直到p被約爲1或者成爲一個質數(但是成爲質數的情況也要分類討論)。
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
bool isPrime(int n) {
if(n==1) return false;
for(int i=2; i*i<=n; i++) {
if(n%i==0) return false;
}
return true;
}
int main() {
int t,p;
cin>>t;
while(t--) {
cin>>p;
int i,flag=0;
if(isPrime(p)) printf("%d\n",p);
else {
for(i=2; p>1; i++) {
int gcdval=gcd(p,i);
p/=gcdval; //約去最大公約數
if(i<p&&isPrime(p)) { //注意即使當p成爲質數但是i>p還是不能break
flag=1;
break;
}
}
printf("%d\n",flag?p:i-1);
}
}
return 0;
}
這題在比賽的時候就掉了if(i<p&&isPrime(p))
中的i<p
這個條件…