数学知识-质数&约数
质数
试除法判定质数
#include<bits/stdc++.h> using namespace std; typedef long long ll; bool check(ll x) { for(ll i=2;i<=sqrt(x);i++) { if(x%i==0) return false; } return true; } int main() { ll i,j,n,x; cin>>n; while(n--) { cin>>x; if(x==1) puts("No"); else if(check(x)) puts("Yes"); else puts("No"); } return 0; }
分解质因数
例如:
6=2*3
输出:
2 1
3 1
例如:
8=2*2*2
输出:
2 3
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=110; ll a; int main() { ll i,j,n; cin>>n; while(n--) { cin>>a; for(i=2;i<=a/i;i++) { if(a%i==0) { ll s=0; while(a%i==0) { s++; a/=i; } cout<<i<<" "<<s<<endl; } } if(a>1) cout<<a<<" "<<1<<endl; cout<<endl; } return 0; }
筛质数
给定一个数n,求1~n中的质数的个数
埃式筛
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+10; ll n; bool flag[maxn]; void aishi(ll x) { ll ans=0; for(ll i=2;i<=n;i++) { if(flag[i]==false) { ans++; flag[i]=true; for(ll j=i*2;j<=n;j+=i) flag[j]=true; } } cout<<ans<<endl; } int main() { ll i,j; cin>>n; aishi(n); return 0; }
线性筛
n只会被他的最小质因子筛,每个数只筛一次
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+10; ll n; bool flag[maxn]; int cnt; int st[maxn]; void aishi() { for(ll i=2;i<=n;i++) { if(flag[i]==false) st[cnt++]=i; for(ll j=0;st[j]<=n/i;j++) { flag[ st[j] * i ]=true; if(i%st[j]==0) break; } } cout<<cnt<<endl; } int main() { ll i,j; cin>>n; aishi(); return 0; }
约数
试除法求约数
求一个数的所有约数:例如8:1*8,2*4,所以输出:1 2 4 8
#include<bits/stdc++.h> using namespace std; const int maxn=110; vector<int> fun(int k) { vector<int> ans; for(int i=1;i<=sqrt(k);i++) { if(k%i==0) { ans.push_back(i); if(k/i!=i) ans.push_back(k/i); } } sort(ans.begin(),ans.end()); return ans; } int main() { int i,j,n,t; cin>>n; while(n--) { cin>>t; vector<int> ans=fun(t); for(auto t:ans) cout<<t<<" "; cout<<endl; } return 0; }
约数个数
给定n个正整数ai,请你输出这些数的乘积的约数个数
N=a1x1a2x2a3x3.....
个数:(x1+1)(x2+1)(x3+1)...(xn+1)
#include<bits/stdc++.h> using namespace std; const int maxn=110; const int mod=1e9+7; typedef long long ll; ll ans; int main() { int i,j,n,x; cin>>n; ans=1; map<int,int>m; while(n--) { cin>>x; for(i=2;i<=sqrt(x);i++) { while(x%i==0) { m[i]++; x/=i; } } if(x>1) m[x]++; } for(auto t:m) { ans=ans*(t.second + 1) % mod; } cout<<ans<<endl; return 0; }
约数之和
给定n个正整数ai,请你输出这些数的乘积的约数之和,答案对109+7取模。
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; typedef long long ll; map<int,int> primes; int main() { int i,j; int n; cin>>n; while(n--) { int x; cin>>x; for(i=2;i<=x/i;i++) { while(x%i==0) { x/=i; primes[i]++; } } if(x>1) primes[x]++; } ll res=1; for(auto pri:primes) { int p=pri.first,a=pri.second; ll t=1; while(a--) { t=(t*p+1)%mod; } res=res*t%mod; } cout<<res<<endl; return 0; }
最大公约数
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); } int main() { ll i,j,n,a,b; cin>>n; while(n--) { cin>>a>>b; cout<<gcd(a,b)<<endl; } return 0; }