1. 首页
  2. 数论

LightOJ 1341 Aladdin and the Flying Carpet(合数分解)

题意:给定整数 a 和 b ,求区间[b, a] 内的 a 的约数的个数。

算术基本定理(唯一分解定理)

一个大于1的正整数N,如果它的标准分解式为:

那么它的正因数个数为

#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#include<map>
#include<vector>
#include<queue>
#include<stack>
//#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 1050;

const int MAXN=1000010;
int prime[MAXN+1];

void getPrime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2; i<=MAXN; ++i)
    {
        if(!prime[i])
            prime[++prime[0]]=i;
        for(int j=1; j<=prime[0] && prime[j]<=MAXN/i; j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }

}

long long factor[100][2];
int fatCnt;

int getFactors(long long x)
{
    fatCnt=0;
    long long tmp=x;
    for(int i=1; prime[i]<=tmp/prime[i]; i++)
    {
        factor[fatCnt][1]=0;
        if(tmp%prime[i]==0)
        {
            factor[fatCnt][0]=prime[i];
            while(tmp%prime[i]==0)
            {
                factor[fatCnt][1]++;
                tmp/=prime[i];
            }
            fatCnt++;
        }
    }
    if(tmp!=1)
    {
        factor[fatCnt][0]=tmp;
        factor[fatCnt++][1]=1;
    }
    return fatCnt;
}

int main()
{
    getPrime();
    int t;
    cin>>t;
    int casee=1;
    LL a,b;
    while(t--)
    {
        // cin>>a>>b;
        scanf("%lld%lld",&a,&b);
        if(a/b<b)
        {
            printf("Case %d: 0n",casee++);
            continue;
        }
        int cnt=getFactors(a);
        // cout<<cnt<<endl;
        int ans=1;
        for(int i=0; i<cnt; ++i)
        {
            //cout<<factor[i][0]<<endl;
            ans*=(factor[i][1]+1); //唯一分解定理
        }
        ans>>=1;
        for(int i=1; i<b; ++i)
        {
            if(a%i==0)
            {
                ans--;
            }
        }

        printf("Case %d: %dn",casee++,ans);

    }


    return 0;
}

素数筛选和合数分解

const int MAXN=1000010;
int prime[MAXN+1];
//线性筛选
void getPrime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2; i<=MAXN; ++i)
    {
        if(!prime[i])
            prime[++prime[0]]=i;
        for(int j=1; j<=prime[0] && prime[j]<=MAXN/i; j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}

long long factor[100][2];
//factor[i][0]==P1; factor[i][1]==a1;
//其正因子个数为S=(1+a1)(1+a2)...(1+an)
int fatCnt;

int getFactors(long long x)
{
    fatCnt=0;
    long long tmp=x;
    for(int i=1; prime[i]<=tmp/prime[i]; i++)
    {
        factor[fatCnt][1]=0;
        if(tmp%prime[i]==0)
        {
            factor[fatCnt][0]=prime[i];
            while(tmp%prime[i]==0)
            {
                factor[fatCnt][1]++;
                tmp/=prime[i];
            }
            fatCnt++;
        }
    }
    if(tmp!=1)
    {
        factor[fatCnt][0]=tmp;
        factor[fatCnt++][1]=1;
    }
    return fatCnt;
}

 

评分 0, 满分 5 星
0
0
看完收藏一下,下次也能找得到
  • 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
  • 文章链接:http://www.carlstedt.cn/archives/71 (转载时请注明本文出处及文章链接)
上一篇:
:下一篇

发表评论

gravatar

快来吐槽一下吧!

  1. .01 4:06
  2. .02 1:47
  3. .03 3:39
  4. .04 1:40