virtual hust 2013.6.21 NEFU 挑战编程----数论 D - Factovisors

题目:Factovisors

思路:直接质因式分解除数,然后求得阶乘各质因子的幂是否大于除数的,注意特判情况(存在一个较大的素数,这个要判断n是不是大于等于那个很大的素数)

 

复制代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 60000
bool vis[maxn];
int prime[maxn];
int cnt[maxn];
int n_prime=0;
void Prime()
{
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1]=0;
    for(int i=2;i<maxn;i++)
    {
        if(vis[i])
        {
            prime[++n_prime]=i;
            for(int j=2*i;j<maxn;j+=i)
                vis[j]=0;
        }
    }
    //cout<<n_prime<<":"<<prime[n_prime]<<endl;
}
int get(int n,int factor)
{
    int ans=0;
    int tmp=factor;
    while(tmp<=n)
    {
        ans+=n/tmp;
        tmp*=factor;
    }
    return ans;
}
bool is_ok(int n,int num)
{
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=n_prime;i++)
    {
        while(num%prime[i]==0)
        {
            num/=prime[i];
            cnt[i]++;
        }
    }
    cnt[0]=num;
    if(n<cnt[0]&&cnt[0]>1)
        return false;
    for(int i=1;i<=n_prime;i++)
    {
        if(cnt[i])
        {
            if(get(n,prime[i])<cnt[i])
                return false;
        }
    }
    return true;
}
int main()
{
    int n,num;
    Prime();
    while(scanf("%d%d",&n,&num)!=EOF)
    {
        if(is_ok(n,num))
            printf("%d divides %d!\n",num,n);
        else
            printf("%d does not divide %d!\n",num,n);
    }
    return 0;
}
View Code
复制代码

 

posted @   over_flow  阅读(173)  评论(0编辑  收藏  举报
编辑推荐:
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 大模型 Token 究竟是啥:图解大模型Token
阅读排行:
· 如何开发 MCP 服务?保姆级教程!
· 1.net core 工作流WorkFlow流程(介绍)
· 瞧瞧别人家的限流,那叫一个优雅!
· C# 工业视觉开发必刷20道 Halcon 面试题
· 从零散笔记到结构化知识库:我的文档网站建设之路
点击右上角即可分享
微信分享提示