码迷,mamicode.com
首页 > 其他好文 > 详细

Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】(未完成)

时间:2019-11-27 12:25:43      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:line   超过   入门   bit   最小   不能   描述   clu   turn   

Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】(未完成)

标签:入门讲座题解 数论


题目描述


题意


解析


通过代码

/*
Problem
    LightOJ - 1341
Status
    Accepted
Time
    359ms
Memory
    6968kB
Length
    1607
Lang
    C++
Submitted
    2019-11-25 21:51:33
RemoteRunId
    1640797
*/

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int MAXN = 1e6 + 50;

bool vis[MAXN];
int prime[MAXN], cnt = 0;

inline ll read()    //快读,加快程序输入速度.
{
    ll res = 0;
    char ch;

    ch = getchar();

    while(!isdigit(ch))
        ch = getchar();

    while(isdigit(ch)){
        res = (res << 3) + (res << 1) + ch - 48;

        ch = getchar();
    }

    return res;
}

void get_prime()     //欧拉筛,先找到sqrt(n)以内的质数,方便之后质因数分解.
{
    vis[1] =  1;
    for(int i = 2; i <= int(1e6 + 5); i ++){
        if(!vis[i])
            prime[++ cnt] = i;

        for(int j = 1; j <= cnt && i * prime[j] <= int(1e6 + 5); j ++){
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0)
                break;
        }
    }
    return ;
}

int main()
{
    get_prime();

    int times, _case = 0;

    scanf("%d", &times);

    while(times --){
        ll a, b, t;
        ll ans = 1;

        a = read(), b = read();
        t = a;

        if(b * b >= a){              //如果最小的因数都超过了sqrt(a),那么说明不存在符合条件的成对的因数了.
            printf("Case %d: 0\n", ++_case);
            continue;
        }
        
        for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= a; i ++){
            if(a % prime[i] == 0){
                int res = 0;
                while(a % prime[i] == 0){
                    res ++;
                    a /= prime[i];
                }

                ans *= 1ll * (res + 1);
            }
        }
        if(a > 1)
            ans <<= 1;
            
        ans >>= 1;    //问有几对,两个因数算作一对.(如果是完全平方数的sqrt(a)因子,则不能算作一对.)
        
        for(ll i = 1; i < b; i ++){
            if(t % i == 0)
                ans --;
        }
        printf("Case %d: %lld\n", ++ _case, ans);
    }
    return 0;
}

Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】(未完成)

标签:line   超过   入门   bit   最小   不能   描述   clu   turn   

原文地址:https://www.cnblogs.com/satchelpp/p/11941141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!