Factorial Problem in Base K(zoj3621)

Factorial Problem in Base K


Time Limit: 2 Seconds Memory Limit: 65536 KB


How many zeros are there in the end of s! if both s and s! are written in base k which is not necessarily to be 10? For general base, the digit order is 0-9,A-Z,a-z(increasingly), for example F4 in base 46 is actually 694 in base 10,and f4 in base 46 is 1890 in base 10.

Input

There are multiple cases(less than 10000). Each case is a line containing two integers s and k(0 ≤ s < 2^63, 2 ≤ k ≤ 62).

Output

For each case, output a single line containing exactly one integer in base 10 indicating the number of zeros in the end of s!.

Sample Input

101 2
12 7

Sample Output

3
1
题意:给你s和k表示k进制的s;现在求s的10进制的阶乘换成k进制后末尾有几个0;

思路:找k进制的质因子个数kv[i],以及s的阶乘中质因子的个数pn,那么最后换成k进制后有多少个0,就是pn/kv[i]中最小的。

刚开始找出来pn的时候,测试数据都过了,可是WA了,,,,后来我把ans开很大很大,结果就过了。郁闷
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#define N 65
using namespace std;
char str[N];
int k;
long long s;
int prm[20]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61},kv[20];
/*
int judge(int x,int tp)
{
    int y=x,a=0;
    while(y<=tp)
    {

        a+=tp/y;
//        printf("y:%d\ttemp:%d     ans:%d\n",y,temp,ans);
        if(tp/y<x)
            break;
        y*=x;
    }
    return a;
}*/
void solve(long long x)
{
    int i;
    long long res,ans=0x7ffffffffffffff;//开小了,,居然WA
    long long pn;
    for(i=0; i<18; i++)
    {
        res=x;
        res=res/prm[i];
        pn=res;
        while(res)
        {
            res=res/prm[i];
            pn+=res;
        }
        if(kv[i]&&pn/kv[i]<ans) ans=pn/kv[i];
    }
    printf("%lld\n",ans);
}
int main()
{
    int i,j;
    while(scanf("%s%d",str,&k)!=EOF)
    {
        int len=strlen(str);
        s=0;
        for(i=0; i<len; i++)
        {
            int num;
            if(str[i]<=‘z‘&&str[i]>=‘a‘)
                num=str[i]-‘a‘+36;
            else if(str[i]<=‘Z‘&&str[i]>= ‘A‘)
                num=str[i]-‘A‘+10;
            else
                num=str[i]-‘0‘;
            s=num+s*k;
        }
        memset(kv,0,sizeof(kv));
        int n=k,x;
        for(i=0; i<18; i++)
        {
            while(n%prm[i]==0)
            {
                kv[i]++;
                n/=prm[i];
            }
        }
        solve(s);
    }
    return 0;
}
记得以前也做过类似的题。就是求阶乘中含多少质因子的题目。
时间: 2024-10-05 12:56:01

Factorial Problem in Base K(zoj3621)的相关文章

zoj 3621 Factorial Problem in Base K 数论 s!后的0个数

Factorial Problem in Base K Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3621 Description How many zeros are there in the end of s! if both s and s! are written in base k which is not nece

poj Problem A. Score Sequence(暴力)

这道题,对于我这种英文不好的人来说,有点费劲啊. 题目的意思:给你两组成绩,你要找出他们之间最大的公共子序列,不能有重复,然后输出两组数据. 第一组就是:按照从大到小输出最大子序列. 第二组就是:按照个位数由小到大输出,若个位数一样大,则小的在前输出最大子序列. 解题思路基本上已经出来了,就是千万要注意就是在最长子序列匹配之前就就把重复的数字给删除. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h

Problem A: 数组类(I)

Problem A: 数组类(I) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3295  Solved: 2418[Submit][Status][Web Board] Description 封装一个整型数组类,用于存储整数和处理的相关功能,支持以下操作: 1. Array::Array()无参构造方法:创建一个空数组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::get(int n)方法:按

Problem B: 数组类(II)

Problem B: 数组类(II) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3606  Solved: 1760[Submit][Status][Web Board] Description 封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作: 1. Array::Array(int l)构造方法:创建一个长度为l的组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::put(int

Problem A: 字符串类(I)

Problem A: 字符串类(I) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6383  Solved: 3131[Submit][Status][Web Board] Description 封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符串对象,串的内容由参数给出. 3. STR::len

Problem B: 字符串类(II)

Problem B: 字符串类(II) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6103  Solved: 2687[Submit][Status][Web Board] Description 封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符串对象,串的内容由参数给出. 3. STR::le

Summary—【base】(HTML)

Html知识点: 1. 建议开发人员计算机基本配置 a) 显示所有文件的后缀名* b) 文件的排列方式改为详细信息,并且名称一定要能够全部显示出来 c) 使用小的任务栏 d) 将常用的工具锁定到任务栏中 2. 浏览器与服务器 a) 浏览器与服务器之间存在交互关系 b) 浏览器的内核又被称之为渲染引擎 c) 目前比较主流的浏览器内核: Trident:IE.猎豹浏览器.360浏览器.极速安全浏览器 Gecko:Firefox WebKit:Safari Blink:chrome .opera 参考

Summary—【base】(JavaScript)

1.认识Js 1.1 Js就是一门运行在客户端浏览器的脚本编程语言 1.2 组成 ECMAScript:Js的语法标准 DOM:JS操作网页上的元素的API(应用接口),即操作网页 BOM:JS操作浏览器的部分功能的API,即控制浏览器 1.3特点 ①简单易用 ②解释执行(解释语言):JS源代码是直接通过JS引擎执行的,并且是逐行解释执行 ③基于对象 2.JS与HTML.CSS Html:  是用来制作网页,简单来说就是编写网页结构. CSS:用来编写网页的样式 Javascript:   实现

Git Base 操作(一)

Git常用命令 1. 命令git init把这个目录变成Git可以管理的仓库: 2. 命令git commit把文件提交到仓库 这里需要注意的是,Git只能跟踪文本文件的改动,如txt文件,网页,所有的程序代码等等,如在第5行加了一个单词“Linux”.而图片.视频是二进制文件,没办法跟踪文件的变化,只能把二进制文件每次改动穿起来,也就是只知道图片从100K改成了200K,到底改了啥,没办法知道. 另外还需要注意的是,不要使用Windows自带的记事本编辑,最好使用Notepad++代替. 现在