题目
给你N个数
对于每个数Ai
问你能否给出一个答案,Ai是否存在两个因子d1 > 1 d2 > 1
满足
gcd(d1+d2,Ai) == 1
N <= 5e5
题解思路
引入一个定理
这题就很简单了,直接枚举比他小的质数,把这个质数拿从出去,除出另一边d2,然后判断是否为1即可。
d1肯定只有1个质数组成,而d2就由其他质数组成。
他们肯定是互质的,所以满足上面的式子。
这题在用质数试除的时候被卡longlong除了,建议少用longlong除。
AC代码
longlong乘
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 500100;
int d1[N] ;
int d2[N] ;
int prm[N] ;
int vis[N] ;
int a[N] ;
int cnt ;
void si()
{
for (int i = 2 ; i <= N - 100 ; i++ )
{
if ( !vis[i] )
prm[cnt] = i , cnt++ ;
for (int j = 0 ; j < cnt && prm[j] <= (N-100)/i ; j++ )
{
vis[i*prm[j]] = 1 ;
if ( i % prm[j] == 0 )
break ;
}
}
}
int main()
{
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
si();
int n ;
scanf("%d",&n) ;
for (int i = 1 ; i <= n ; i++ )
scanf("%d",&a[i]) ;
for (int i = 1 ; i <= n ; i++ )
{
long long j ;
j = a[i] ;
long long tt = 1 ;
int falg = 0 ;
for (int k = 0 ; k < cnt && (long long )prm[k]*prm[k] <= j ; k++ )
{
while ( j % prm[k] == 0 )
{
j/=prm[k] ;
falg = 1 ;
tt*=prm[k] ;
}
if ( falg )
break ;
}
if ( tt == 1 || j == 1 )
d1[i] = -1 , d2[i] = -1 ;
else
d1[i] = tt , d2[i] = j ;
}
for (int i = 1 ; i <= n ; i++ )
cout << d1[i] << " " ;
cout << "\n" ;
for (int i = 1 ; i <= n ; i++ )
cout << d2[i] << " " ;
return 0 ;
}
int
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 500100;
int d1[N] ;
int d2[N] ;
int prm[N] ;
int vis[N] ;
int a[N] ;
int cnt ;
void si()
{
for (int i = 2 ; i <= N - 100 ; i++ )
{
if ( !vis[i] )
prm[cnt] = i , cnt++ ;
for (int j = 0 ; j < cnt && prm[j] <= (N-100)/i ; j++ )
{
vis[i*prm[j]] = 1 ;
if ( i % prm[j] == 0 )
break ;
}
}
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
si();
int n ;
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
cin >> a[i] ;
for (int i = 1 ; i <= n ; i++ )
{
int j ;
j = a[i] ;
int tt = 1 ;
int falg = 0 ;
for (int k = 0 ; k < cnt && prm[k] <= j/prm[k] ; k++ )
{
while ( j % prm[k] == 0 )
{
j/=prm[k] ;
falg = 1 ;
tt*=prm[k] ;
}
if ( falg )
break ;
}
if ( tt == 1 || j == 1 )
d1[i] = -1 , d2[i] = -1 ;
else
d1[i] = tt , d2[i] = j ;
}
for (int i = 1 ; i <= n ; i++ )
cout << d1[i] << " " ;
cout << "\n" ;
for (int i = 1 ; i <= n ; i++ )
cout << d2[i] << " " ;
return 0 ;
}