标签:Educational Rated ai Codeforces int p1 right d2 d1
这是道很有意思的数论题
题目链接
https://codeforces.com/contest/1366/problem/D
题目大意
给你一个长度为 N 的数组 a , 对于数组中的每个数 ai
你需要找到 ai 的两个因子 d1 , d2 使得 gcd(d1 + d2 , ai) = 1
解题思路
设 p1 , p2 , p3 , ... , pm 为 ai 的质因子 , d1 = p1^k , d2 = ai / p1^k
其中 ai % p^k = 0 且 ai % p1^(k + 1) != 0
那么显然 $\left( d_{1}+d_{2}\right) \% p_{1}\neq 0,\left( d_{1}+d_{2}\right) \% p_{2}\neq 0,\ldots ,\left( d_{1}+d_{2}\right) \% p_{m}\neq 0$
因为 d1 + d2 与 ai 的所有质因子互质 , 所以 d1 + d2 与 ai 互质 ( 当 d2 = 1 时答案为 -1 )
AC_Code
#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; }
标签:Educational,Rated,ai,Codeforces,int,p1,right,d2,d1 来源: https://www.cnblogs.com/StarRoadTang/p/13099862.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。