题目链接
题目大意
让你找出x的两个因子d1>1,d2>1使得gcd(d1+d2,x)=1
题目思路
首先要明白gcd的性质
gcd(a,b)=gca(a+b,b)
if(gcd(a,c)==1) gcd(a,bc)=gcd(a,b)
则推出当x与y互质gcd(x+y,x*y)=1
那么就简单了,直接唯一分解x=p1^ t1 p2^ t2 p3^ t3…令d1=p1^t1 ,d2=x/d1即可
注意唯一分解定理要先欧拉筛,不然会TLE,然后其实可以直接欧拉筛的时候预处理他的最小质因子即可更快
不预处理代码
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
int n,a[maxn],d1[maxn],d2[maxn];
int isprime[maxn],prime[maxn],numprime;
void getprime(int n){
for(int i=2;i<=n;i++){
if(!isprime[i]){
prime[++numprime]=i;
}
for(ll j=1;j<=numprime&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
void cal(int pos,int x){
for(int i=1;i<=numprime&&1ll*prime[i]*prime[i]<=x;i++){
if(x%prime[i]==0){
d1[pos]=1;
while(x%prime[i]==0){
d1[pos]*=prime[i];
x/=prime[i];
}
if(x!=1){
d2[pos]=x;
}else{
d1[pos]=d2[pos]=-1;
}
return ;
}
}
d1[pos]=d2[pos]=-1;
}
int main(){
getprime(1e7);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cal(i,a[i]);
}
for(int i=1;i<=n;i++){
printf("%d%c",d1[i],i==n?'\n':' ');
}
for(int i=1;i<=n;i++){
printf("%d%c",d2[i],i==n?'\n':' ');
}
return 0;
}
预处理代码
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
int n,a[maxn],d1[maxn],d2[maxn];
int isprime[maxn],prime[maxn],numprime;
void getprime(int n){
for(int i=2;i<=n;i++){
if(isprime[i]==0){
prime[++numprime]=i;
}
for(ll j=1;j<=numprime&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=prime[j];//最小的质因数
if(i%prime[j]==0) break;
}
}
}
void cal(int pos,int x){
if(isprime[x]==0){
d1[pos]=d2[pos]=-1;
}else{
d1[pos]=1;
int misu=isprime[x];//最小的质因数
while(x%misu==0){
x=x/misu;
d1[pos]*=misu;
}
if(x!=1){
d2[pos]=x;
}else{
d1[pos]=d2[pos]=-1;
}
}
}
int main(){
getprime(1e7);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cal(i,a[i]);
}
for(int i=1;i<=n;i++){
printf("%d%c",d1[i],i==n?'\n':' ');
}
for(int i=1;i<=n;i++){
printf("%d%c",d2[i],i==n?'\n':' ');
}
return 0;
}