質因數分解那裡應該可以更快,但我不知道怎麼修正,如果有人知道可以回覆一下,謝謝
#include<bits/stdc++.h> using namespace std; int gcd(int a,int b); int main() { ios::sync_with_stdio(0);cin.tie(0);
const int N=65536+1; vector<int> prime; vector<int> spf(N); //smallest prime factor spf[0]=spf[1]=-1; //線性篩 for(int i=2; i<N; i++) { if(spf[i]==0) { prime.push_back(i); spf[i]=i; } //for(int j:prime)是複製參數 for(const int &j :prime)是直接參照,比較快 for(const int &j:prime) { if (1LL * i * j >= N) break; if (j > spf[i]) break; spf[i*j]=j; } } //主程式 int n; cin >> n; while(n--) { int a,b; cin >> a >> b; //質因數分解 vector<int> prime_factor; int temp=a; while(spf[temp]>1){ prime_factor.push_back(spf[temp]); temp/=spf[temp]; } int t=1; for(int i=0;i<prime_factor.size()-1;i++){ if(prime_factor[i]==prime_factor[i+1])t++; else{ if(t==1)cout << prime_factor[i]; else cout << prime_factor[i] << "^" << t; cout << "*"; t=1; } } if(t==1)cout << prime_factor[prime_factor.size()-1]; else cout << prime_factor[prime_factor.size()-1] << "^" << t; cout << " , "; //最大公因數(輾轉相除法) int max_commom_factor=gcd(a,b); cout << max_commom_factor ; cout << " , "; //判斷gcd是否為質數 cout << ((spf[max_commom_factor]==max_commom_factor) ? "Y" : "N");cout << endl; } }
//輾轉相除法(遞迴) int gcd(int a,int b) { return b==0 ? a : gcd(b, a%b); }