uva 10780 Again Prime? No Time. 质因子乱搞

求最大的k   使得 m^k 能被n!整除

m^k就是让m的每个质因子个数增加了k倍,只要求得n!的质因子能让m增加多少倍就够了。当然这里要取增加倍数最少的。

木桶装水的量取决于最短的木板。

预处理2-n每个数的质因子情况,由于n有10000,前10000个素数有1000+个,所以维护前缀和不划算。

case只有500 所以干脆每次都算一遍。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<map>
using namespace std;
struct node
{
    int x,t;
}t,tzf[100001];
vector<node> v[100001];
vector<int> pri;
int id[100011];
bool vis[100011];
void sieve()
{
    int m= (int)sqrt(200001+0.5);
    memset(vis,0,sizeof(vis));
    for(int i=2;i<=m;i++)
    {
        if(!vis[i])
        {
            for(int j=i*i;j<=10000;j+=i)
                vis[j]=1;
        }
    }
    for(int i=2;i<=10000;i++)
    {
        if(!vis[i])
        {
            pri.push_back(i);
        }
    }
}
void init(int n)
{
    int id=n;
    for(int i=0;pri[i]*pri[i]<=n&&i<pri.size();i++)
    {
        if(n%pri[i]==0)
        {
            t.x=pri[i];
            t.t=1;
            n/=pri[i];
            while(n%pri[i]==0)
            {
                n/=pri[i];
                t.t++;
            }
            v[id].push_back(t);
        }
    }
    if(n>1)
    {
        t.x=n;
        t.t=1;
        v[id].push_back(t);
    }
}
int sum[100005];
int main()
{
    sieve();
    for(int i=2;i<=10000;i++)
        init(i);
    int cas;
    scanf("%d",&cas);
    int ca=1;
    while(cas--)
    {
        int n,m;
        memset(sum,0,sizeof(sum));
        scanf("%d%d",&n,&m);
        printf("Case %d:\n",ca++);
        int top=0;
        for(int i=2;i*i<=n;i++)
        {
            if(n%i==0)
            {
                n/=i;
                tzf[top].x=i;
                tzf[top].t=1;
                while(n%i==0)
                {
                    n/=i;
                    tzf[top].t++;
                }
                top++;
            }
        }
        if(n>1)
        {
            tzf[top].x=n;
            tzf[top].t=1;
            top++;
        }
        for(int i=2;i<=m;i++)
        {
            for(int j=0;j<v[i].size();j++)
            {
                int tmp=v[i][j].x;
                int ttmp=v[i][j].t;
                sum[tmp]+=ttmp;
            }
        }
       int ans=0x7fffffff;
        for(int i=0;i<top;i++)
        {
            int tmp=tzf[i].x;
            int ttmp=tzf[i].t;
            ans=min(ans,sum[tmp]/ttmp);
        }
        if(ans==0||ans==0x7fffffff) puts("Impossible to divide");
        else cout<<ans<<endl;
    }
    return 0;
}
/*
1234
2 10
2 100
97 12
*/

uva 10780 Again Prime? No Time. 质因子乱搞

时间: 2024-10-19 12:42:00

uva 10780 Again Prime? No Time. 质因子乱搞的相关文章

UVA - 10780 Again Prime? No Time. (质因子分解)

Description Again Prime? No time. Input: standard input Output: standard output Time Limit: 1 second The problem statement is very easy. Given a number n you have to determine the largest power of m, not necessarily prime, that divides n!. Input The

uva 10780 Again Prime? No Time.

POINT : 质因子分解:(仅给题解) http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1721 题意:给你两个整数m和n,求最大的k使得m^k是n!的约数 思路:首先我们先将m分解质因数,那么m^k就是各个质因数*k而已,那么我们只要判断每个质因数的指数在n!的对应的质因数的指数范围内,求所有质因数最小的一

UVa 10780 - Again Prime? No Time.(唯一分解)

输入n.m,求最大k使(mk)%n=0.首先筛选出所有素数,然后求出所有n,唯一分解的结果.对于m进行分解,对于每一个在m中的素数p[i]的指数e[i],k=min(e[i]). #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=10010; int p[maxn],pnum,en[maxn][1250],em[maxn]; bool np

(hdu step 2.1.3)Largest prime factor(求一个数的最大质因子的位置)

题目: Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4868 Accepted Submission(s): 1452   Problem Description Everybody knows any number can be combined by the prime number.Now,

UVA10780 - Again Prime? No Time.(分解质因子)

题目链接 题意:输入两个整数n和m,求最大的整数k使得m^k是n!的约数. 思路:m^k等于m的所有质因子的k次方的和,所以只要找到m中的质因子在n!中所能得到的最小的次方,就是k的值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int I

分解质因子(个人模版)

分解质因子: 1 memset(prime,0,sizeof(prime)); 2 memset(num,0,sizeof(num)); 3 for(int i=2;i<=5000005;i++) 4 { 5 if(prime[i]==0) 6 { 7 for(int j=i;j<=5000005;j+=i) 8 { 9 int temp=j; 10 while(temp%i==0) 11 { 12 num[j]++; 13 temp/=i; 14 } 15 prime[i]=1; 16 }

uva 11610 Reverse Prime

Problem FReverse Prime Input: Standard Input Output: Standard Output There are a few 7 digit positive numbers whose reverse number is a prime number and less than 10^6.  For example: 1000070, 1000090 and 1000240 are first few reverse prime numbers be

求一个数的质因子

private static void prime(int i){ int j = 2; while(true){ while(i%j == 0 && i != j){ System.out.println("Prime num " + j); i = i/j; } if(i == j){ System.out.println("Prime num " + j); break; } j++; } } private static void prime

数论 UVA 10780

数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1<n<10000.通过分析我们可知,当n在100 以上后n!早已超出了int甚至__int64的范围了.即使在int范围内,要算出n!和m^k然后依次遍历,这样会超时. 所以我们可以考虑将如果m能整除n!,那么m^k才会有可能整除n!.如果n!可以整除m,那么将m进行质因数分解后,所得的所有质因子