Aladdin and the Flying Carpet LightOJ - 1341 (素数打表 + 算术基本定理)

题意:

就是求a的因数中大于b的有几对

解析;

先把素数打表

运用算术基本定理 求出a的所有因数的个数

然后减去小于b的因数的个数

代码如下:

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define maxn 1100000
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int LL_INF = 0x7fffffffffffffff,INF = 0x3f3f3f3f;
LL primes[maxn];
bool vis[maxn];
LL ans = 0;
void init()
{
    mem(vis,0);
    for(int i=2; i<maxn; i++)
        if(!vis[i])
        {
            primes[ans++] = i;
            for(LL j=(LL)i*i; j<maxn; j+=i)
                vis[j] = 1;
        }
}
int main()
{
    init();
    int T, kase = 0;
    scanf("%d",&T);
    LL a, b;
    while(T--)
    {
        LL res = 1;
        scanf("%lld%lld",&a,&b);
        if(a <= b*b)  {printf("Case %d: 0\n",++kase);continue;}
        LL x = a;
        for(LL i=0; i<ans && primes[i] * primes[i] <= a; i++)
        {
            LL cnt2 = 0;
            while(a % primes[i] == 0)
            {
                a /= primes[i];
                cnt2++;
            }
            if(cnt2 > 0)
            {
                res *= (cnt2 + 1);
//                if(primes[i] < b)
//                    ios *= (cnt2+1);
            }    
        }
        if(a > 1)
        {
            res *= 2;
//            if(a < b)
//                ios *= 2;
        }
        res /= 2;
        for(int i=1; i<b; i++)
            if(x % i == 0)
                res--;
        printf("Case %d: %lld\n",++kase,res);
        
    }    

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WTSRUVF/p/9187113.html
今日推荐