`

UVA 10139 Factovisors

阅读更多
/*
*   [题意]
*   判断n!是否能被m整除(n!/m = 整数)
*
*   [解题方法]
*   对m分解素因子,得出每个素因子的个数
*   若某个素因子个数大于n!中此因子的个数,则不可整除
*/

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
#define LL long long
#define M 100000
#define inf 0x3fffffff

int p[9600], vis[M], k;

int cal (int f, int x)  //计算f!中有多少个x因子
{
    int res = 0;
    while (f) {
        f /= x;
        res += f;
    }
    return res;
}

bool judge(int n, int m)
{
    int i;
    for (i = 0; i < k && (LL)p[i]*p[i] <= m; i++)
    {
        if (m % p[i] == 0)
        {
            int tp = 0;
            do
            m /= p[i], ++tp;
            while (m % p[i] == 0);
            if (cal(n, p[i]) < tp) return false;
        }
    }
    if (m > 1 && n < m) return false;
    return true;
}

int main()
{
    int i, j, n, m;
    k = 0;
    for (i = 2; i < M; i++)
    {
        if (!vis[i])
        {
            p[k++] = i;
            for (j = i+i; j < M; j+=i)
                vis[j] = 1;
        }
    }
    while (cin >> n >> m)
    {
        if (judge(n, m)) printf ("%d divides %d!\n", m, n);
        else printf ("%d does not divide %d!\n", m, n);
    }
    return 0;
}
2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics