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);
posted @ 2021-03-28 15:16  一个经常掉线的人  阅读(49)  评论(0)    收藏  举报