Acwing 数论打卡
试除法判定质数
https://www.acwing.com/problem/content/868/
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<cmath>
using namespace std;
bool is_p(int x){
if(x<2){
return false;
}
for(int i=2;i<=sqrt(x);i++){
if(x%i==0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
if(is_p(x)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);
867. 分解质因数
https://www.acwing.com/problem/content/869/
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
void fun(int x){
for(int i=2;i<=x/i;i++){
if(x%i==0){
int s=0;
while(x%i==0){
s++;
x/=i;
}
cout<<i<<' '<<s<<endl;
}
}
if (x>1) cout<< x <<' '<<1<<endl;
cout<<endl;
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
fun(x);
}
return 0;
}
// freopen("testdata.in", "r", stdin);
868. 筛质数
https://www.acwing.com/problem/content/870/
去掉所有素数的倍数,剩下的就是素数
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
const int N=1e6+5;
int prime[N],check[N],cnt;
int n;
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!check[i]){
prime[++cnt]=i;
for(int j=i+i;j<=n;j+=i) check[j]=1;
}
}
}
int main(){
cin>>n;
get_prime(n);
cout<<cnt;
return 0;
}
// freopen("testdata.in", "r", stdin);
线形时间复杂度
核心思想:

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
const int N=1e6+5;
int prime[N],check[N],cnt;
int n;
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!check[i]){
prime[cnt++]=i;
}
for(int j=0;prime[j]<=n/i;j++){
check[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
int main(){
cin>>n;
get_prime(n);
cout<<cnt;
return 0;
}
// freopen("testdata.in", "r", stdin);
869. 试除法求约数
https://www.acwing.com/problem/content/871/
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
vector<int> fun(int n){
vector<int> res;
for(int i=1;i<=n/i;i++){
if(n%i==0){
res.push_back(i);
//如果n能整除i,那么也能整除n/i
if(i!=n/i){
res.push_back(n/i);
}
}
}
sort(res.begin(),res.end());
return res;
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
auto res=fun(x);
for(auto i:res){
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);
870. 约数个数
https://www.acwing.com/problem/content/872/
定理:对于一个数n可以转化成p1的a1次方p2的a2次方----pn的an次方
有约数个数=(a1+1)(a2+1)(a3+1)----(an+1)
约数之和为:

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
int main(){
int n;
cin>>n;
unordered_map<int,int>primes;
while(n--){
int x;
cin>>x;
for(int i=2;i<=x/i;i++){
while(x%i==0){
x/=i;
primes[i]++;
}
}
if (x>1) primes[x] ++ ;
}
LL res=1;
for(auto prime: primes){
res=res*(prime.second+1)%mod;
}
cout<<res<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
871. 约数之和
https://www.acwing.com/problem/content/873/
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
int main(){
int n;
cin>>n;
unordered_map<int,int>primes;
while(n--){
int x;
cin>>x;
for(int i=2;i<=x/i;i++){
while(x%i==0){
x/=i;
primes[i]++;
}
}
if (x>1) primes[x] ++ ;
}
LL res=1;
for(auto prime: primes){
int p=prime.first,a=prime.second;
LL t=1;;
while(a--){
t=(t*p+1)%mod;
//t=1时 乘一次就是p+1 乘两次就是p平方+p+1
}
res=res*t%mod;
}
cout<<res<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
872. 最大公约数
https://www.acwing.com/problem/content/874/
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int fun(int a,int b){
if(!b) return a;
else return fun(b,a%b);
}
int main(){
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
cout<<fun(a,b)<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);

浙公网安备 33010602011771号