Educational Codeforces Round 89 (Rated for Div. 2)D. Two Divisors
题目链接 cf题目地址地址
转载来自 本文参考答案链接
个人学习用,如有侵犯,请联系删除。
题目大意
给你一个长度为 N 的数组 a , 对于数组中的每个数 ai
你需要找到 ai 的两个因子 d1 , d2 使得 gcd(d1 + d2 , ai) = 1
解题思路
设 p1 , p2 , p3 , … , pm 为 ai 的质因子 , d1 = p1^k , d2 = ai / p1^k
其中 p1 为 ai 的最小质因子 , ai % p^k = 0 且 ai % p1^(k + 1) != 0
那么显然 (d1+d2)%p1≠0, (d1+d2)%p2≠0 ,…,(d1+d2)%pm≠0
所以 ai 的所有质因子 d1 + d2 都不包含 , 即 d1 + d2 与 ai 互质 ( 当 d2 = 1 时答案为 -1 )
而本题数据范围很大 , 所以我们得先用线性筛找出 1 ~ 1e7 内每个数的 p1 然后再操作
#include<bits/stdc++.h>
using namespace std;
int prime[10000100],minprime[10000100];
int euler(int n)
{
int c = 0;
for(int i = 2 ; i <= n ; i ++)
{
if(!minprime[i]) prime[++ c] = i , minprime[i] = i;
for(int j = 1 ; j <= c && i * prime[j] <= n ; j++)
{
minprime[i * prime[j]] = prime[j];
if(i % prime[j] == 0) break;
}
}
return c;
}
const int N = 5e5 + 10;
int n , a[N] , ans[N][2];
signed main()
{
ios::sync_with_stdio(false);
euler(1e7);
cin >> n;
for(int i = 1 ; i <= n ; i ++) cin >> a[i];
for(int i = 1 ; i <= n ; i ++)
{
int x = a[i] , now = 1 , mi = minprime[x];
while(x % mi == 0) x /= mi , now *= mi;
if(now != 1 && x != 1) ans[i][0] = now , ans[i][1] = x;
else ans[i][0] = -1 , ans[i][1] = -1;
}
for(int j = 0 ; j <= 1 ; j ++)
{
for(int i = 1 ; i <= n ; i ++) cout << ans[i][j] << " ";
cout << '\n';
}
return 0;
}