UVA - 294Divisors+唯一分解定理+约数个数的计算公式

Divisors
N = i = 1 m p i c i N=\prod_{i=1}^m p_i^{c_i}
约数的个数为: i = 1 m ( c i + 1 ) \prod_{i=1}^m (c_i+1)
先打素数表,
唯一分解得出 c i c_i ,计算出约数的个数

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;

const int maxn=1e5;
//欧拉筛法( O(n)  )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
    for(int i=2;i<=n;i++){
        if(!v[i]) p[++np]=i;//此时的i为某个质数
        for(int j=1;j<=np && i*p[j]<=n;j++){
            v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
            if(i%p[j]==0) break;
        }
    }
    return np;
}

int t,l,r;
int main(){
    gg(maxn);
    cin>>t;
    while (t--)
    {
        scanf("%d%d",&l,&r);
        ll ans=0;
        int index=0;
        for(int n=l;n<=r;n++)
        {
            int N = n;
            ll res=1;
            //唯一分解
            for(int i=1;i<=np ;i++)
            {
                if(p[i]>N)
                    break;
                int c=0;
                while(N%p[i]==0) {
                    c++;
                    N/=p[i];
                }
                res*= c+1;
            }
            if(N>1) //以防自己就是素数
                res*=2;
            //更新答案
            if(res>ans)
            {
                ans = res;
                index = n;
            }
        }
        printf("Between %d and %d, %d has a maximum of %lld divisors.\n",l,r,index,ans);
    }
    return 0;
}

发布了67 篇原创文章 · 获赞 0 · 访问量 1498

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/104593385