(数论) 约数

比较难,没怎么看懂

//约数:
//如果一个数d是n的一个约数,即d能整除n,那么n/d也能整除n:
//求所有约数(除法求约数,o(sqrt(n)))
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,x;
set<int>yueshu(int p)//利用set去重并自动排序
{
    set<int>g;
    for(int i=1;i<=p/i;i++) if(p%i==0) g.insert(i),g.insert(p/i);
    //这里我用的set,如果用普通数组的话,要特判一下
    //在(p%i==0)中加一句if(i!=n/i) g[]=..,不然的话有可能取得数重复
    return g; 
}
int main()
{
    cin>>n;
    while(n--){
        cin>>x;
        auto res=yueshu(x);
        for(auto t:res) cout<<t<<" ";
        cout<<endl;
    }
    return 0;
}
//约数个数(基于算术基本定理):https://blog.csdn.net/m0_61855605/article/details/124003504?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BA%A6%E6%95%B0%E4%B8%AA%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124003504.nonecase&spm=1018.2226.3001.4187
//约数之和(筛法)(o(logn))
//1是所有数的约数,2是所有2的倍数的约数,依次类推,所以1-n中
//总共约数的个数和总共倍数的个数是相同的,因为a是b的约数,b就是a的倍数
//那么1就有n个倍数,2有n/2个倍数,1+n/2+n/3+...=n*logn;

//约数个数:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,x;
int main()
{
    cin>>n;
    unordered_map<int,int>hash;
    while(n--){
        cin>>x;
        for(int i=2;i<=x/i;i++){
            while(x%i==0){
                x/=i;
                hash[i]++;
            }
        }
        if(x>1) hash[x]++,cout<<x<<endl;
    }
   // for(auto t:hash) cout<<t.first<<" "<<t.second<<endl;
    long long res=1;
    for(auto t:hash) res=res*(t.second+1)%mod;
    cout<<res;
    return 0;
}
//求一个数的约数个数:https://www.luogu.com.cn/problem/P1403(筛法)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int f[N],res,n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j+=i) f[j]++;
            res+=f[i];
    }
    cout<<res;
    return 0;
}
//欧几里得算法(求最大公约数):
//如果d能整除a,b,那d就能整除(a*n+b*m);
//a和b的最大公约数等于b和a%b的最大公约数
#include<bits/stdc++.h>
using namespace std;
int n;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    cin>>n;
    while(n--){
        int x,y;
        cin>>x>>y;
        cout<<gcd(x,y)<<endl;
    //stl函数直接求: cout<<__gcd(x,y)<<endl;
    }
}

 

posted @ 2023-06-13 19:53  o-Sakurajimamai-o  阅读(71)  评论(0)    收藏  举报
-- --