uoj#48. 【UR #3】核聚变反应强度
求次大公约数
因为所有公约数一定是最大公约数的约数
所以次大公约数一定是 最大公约数/它最小的质因数
因为有一个数是确定的,只要预处理出a1的所有质因数(小于logn个)每次暴力检查即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 long long a[200001],b[200001]; 5 int main() 6 { 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++) 9 scanf("%lld",&a[i]); 10 long long tem=a[1],sq=sqrt(tem); 11 for(int i=2;i<=sq;i++) 12 if(tem%i==0) b[++m]=i,tem/=i; 13 if(tem>1) 14 b[++m]=tem; 15 for(int i=1;i<=n;i++) 16 { 17 long long t=__gcd(a[1],a[i]); 18 if(t==1) 19 { 20 printf("-1 "); 21 continue; 22 } 23 for(int j=1;j<=m;j++) 24 if(t%b[j]==0) { t/=b[j];break;} 25 printf("%lld ",t); 26 } 27 return 0; 28 }