2021-05-30acwing算法基础课 素数,约数,欧拉函数

AcWing 866. 试除法判定质数

1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
bool is_prime(int n){
    if(n<2) return 0;
    for(int i=2;i<=n/i;i++){
       if(n%i==0) return 0;
    }
     return 1;
   // else return 0;
}
int main(){
    int n;
    cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(is_prime(a[i]))cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
            
        }
        

    
}

AcWing 867. 分解质因数

1.题意:
2.题解:

考虑小于4的情况,大于根号n的质因数最多有一个

3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
void divide(int n){
    if(n<=3) cout<<n<<" "<<1<<endl;
    for(int i=2;i<=n/i;i++){
        if(n%i==0){
            int s=0;
            while(n%i==0){
                n/=i;s++;
            }
            cout<<i<<" "<<s<<endl;
        }
        
    }
    if(n>1) cout<<n<<" "<<1<<endl;
    cout<<endl;
}
int main(){
    int n;
    cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            divide(a[i]);
            
        }
        

    
}

AcWing 868. 筛质数

1.题意:
2.题解:

1不是质数,线性筛

3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
void get_prime(int n){
    for(int i=2;i<=n;i++){
        if(!st[i]) primes[tot++]=i;
        for(int j=0;primes[j]<=n/i;j++){
            st[primes[j]*i]=1;
            if(i%primes[j]==0) break;
        }
    }
}
int main(){
    int n;
    cin>>n;
    get_prime(n);
    cout<<tot<<endl;
}

AcWing 869. 试除法求约数

1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;

void get_divisors(int n){
    vector<int> v;
    for(int i=2;i<=n/i;i++){
        if(n%i==0) {
             v.push_back(i);
             if(i!=n/i)
             v.push_back(n/i);
        }
       
    }
     v.push_back(1);
     if(n!=1)
    v.push_back(n);
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        get_divisors(a[i]);
    }
}

AcWing 870. 约数个数

1.题意:
2.题解:

记得开longlong,公式

3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int mod=1e9+7;
bool st[N];
int primes[N];
int tot;
unordered_map<int,int> m;
ll res=1;
void get_sum(int n){
  
  for(int i=2;i<=n/i;i++){
      if(n%i==0){
          int s=0;
          while(n%i==0){
              n/=i;s++;
          }
          m[i]+=s;
      }
  }
  if(n>1) m[n]+=1;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        get_sum(a[i]);
    } 
    for(auto x:m){
        res=res*(x.second+1)%mod;
    }
    cout<<res<<endl;

}

AcWing 871. 约数之和

1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int mod=1e9+7;
bool st[N];
int primes[N];
int tot;
unordered_map<int,int> m;
ll res=1;
void get_sum(int n){
  
  for(int i=2;i<=n/i;i++){
      if(n%i==0){
          int s=0;
          while(n%i==0){
              n/=i;s++;
          }
          m[i]+=s;
      }
  }
  if(n>1) m[n]+=1;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        get_sum(a[i]);
    } 
    for(auto x:m){
        ll sum=0;
        int p=x.first;
       for(int i=0;i<=x.second;i++){
           sum=(sum*p+1)%mod;
       }
       res=res*sum%mod;
    }
    cout<<res<<endl;

}

AcWing 872. 最大公约数

1.题意:
2.题解:

gcd(a,b)=gcd(b,a%b)

3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
int main(){
    int n;
    cin>>n;
    int a,b;
    for(int i=1;i<=n;i++){
        cin>>a>>b;
        cout<<gcd(a,b)<<endl;
    }
}

AcWing 873. 欧拉函数

1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int get_oula(int n){
    int res=n;
    for(int i=2;i<=n/i;i++){
        if(n%i==0){
            int s=0;
            while(n%i==0){
                n=n/i;s++;
            }
            res=res/i*(i-1);
        }
    }
    if(n>1) res=res/n*(n-1);
    
    return res;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        cout<<get_oula(a[i])<<endl;
    }
}

AcWing 874. 筛法求欧拉函数

1.题意:
2.题解:

!分清求约数(n/i)和求质数(n)不同算法
对于线性求质数,对每一个i都要遍历一遍primes[j]

3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
ll res=0;
int phi[N];
void get_oula(int n){
    
    for(int i=2;i<=n;i++){
        if(!st[i]){
            primes[tot++]=i;
            phi[i]=i-1;
           
        }
         for(int j=0;primes[j]<=n/i;j++){
                st[primes[j]*i]=1;
                if(i%primes[j]==0){
                    phi[primes[j]*i]=primes[j]*phi[i];
                    break;
                } 
                phi[primes[j]*i]=(primes[j]-1)*phi[i];
            }
    }
    
}
int main(){
    int n;
    cin>>n;
   get_oula(n);
   phi[1]=1;//!!!!
  for(int i=1;i<=n;i++){
      res+=phi[i];
  }
  cout<<res<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值