zoj 4745 Factorial Problem in Base K

2024-06-07 03:48
文章标签 problem base zoj factorial 4745

本文主要是介绍zoj 4745 Factorial Problem in Base K,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点击打开链接

题目的意思就是:给一个k进制的数s,求s!在10 进制下的末尾0个数。

思路:

先把s转化为10进制下的数。

把n!分解质因数。

把k分解质因数。

求所有的k的质因数中,除以n!的相同质因数中最小的。就是answer。

例如:

看这组数据:10 10.

s本来就是10进制下的。所以不用转化。

10!=2^8*3^4*5^2*7

10=2*5;

看10 的质因数2为1个,对应的10!的的质因数2的个数为8. 8/1=8;

     再看质因数5为1个,对应的           的质因数5的个数为2. 2/1=2;

所以answer=2;

描述不好。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define LL long long
const int N=105;
map<int,int> M;LL f(char *s,int k){LL len=strlen(s),n=0,mid=1;for(int i=len-1;i>=0;i--){n+=(mid*M[s[i]]);mid=mid*k;}return n;
}LL f1(LL x,int k){if(x<k) return 0;return x/k+f1(x/k,k);
}int Prime[20];
int top;
bool Judge(int x){int i;for(i=2;i<=(int)sqrt(x)&&x%i!=0;i++);if(i>(int)sqrt(x)) return true;return false;
}void Init(){top=0;for(int i=2;i<=62;i++)if(Judge(i)) Prime[top++]=i;top=top-1;
}int main(){Init();//A B C D E F G H I J K L M N O P Q R S T U V W X Y ZM['0']=0;M['1']=1;M['2']=2;M['3']=3;M['4']=4;M['5']=5;M['6']=6;M['7']=7;M['8']=8;M['9']=9;M['A']=10;M['B']=11;M['C']=12;M['D']=13;M['E']=14;M['F']=15;M['G']=16;M['H']=17;M['I']=18;M['J']=19;M['K']=20;M['L']=21;M['M']=22;M['N']=23;M['O']=24;M['P']=25;M['Q']=26;M['R']=27;M['S']=28;M['T']=29;M['U']=30;M['V']=31;M['W']=32;M['X']=33;M['Y']=34;M['Z']=35;M['a']=36;M['b']=37;M['c']=38;M['d']=39;M['e']=40;M['f']=41;M['g']=42;M['h']=43;M['i']=44;M['j']=45;M['k']=46;M['l']=47;M['m']=48;M['n']=49;M['o']=50;M['p']=51;M['q']=52;M['r']=53;M['s']=54;M['t']=55;M['u']=56;M['v']=57;M['w']=58;M['x']=59;M['y']=60;M['z']=61;char str[N];int k;while(~scanf("%s%d",str,&k)){LL n=f(str,k);//先把k进制的数转化成10进制的.LL num1[top+1],num2[top+1];memset(num1,0,sizeof(num1));memset(num2,0,sizeof(num2));for(int i=0;i<=top;i++){//将n分解质因数.num1[i]=f1(n,Prime[i]);}for(int i=0;i<=top;i++){//将k分解质因数.while(k%Prime[i]==0) {num2[i]++;k/=Prime[i];}}LL ans=-1;for(LL i=0;i<=top;i++){if(num1[i]&&num2[i]){if(ans==-1) {ans=num1[i]/num2[i];continue;}ans=min(ans,num1[i]/num2[i]);}}if(ans==-1) printf("0\n");else printf("%lld\n",ans);}return 0;
}



这篇关于zoj 4745 Factorial Problem in Base K的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038087

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

docker学习系列(四)制作基础的base项目镜像--jdk+tomcat

前面已经完成了docker的安装以及使用,现在我们要将自己的javaweb项目与docker结合 1.1准备jdk+tomcat软件 ​​我下载了apache-tomcat-7.0.68.tar.gz和jdk-7u79-linux-x64.tar.gz,存储于Linux机器的本地目录/usr/ect/wt/下(利用xshell上传)。利用linux命令 tar -zxvf apache-tom

ZOJ 3324 Machine(线段树区间合并)

这道题网上很多代码是错误的,由于后台数据水,他们可以AC。 比如这组数据 10 3 p 0 9 r 0 5 r 6 9 输出应该是 0 1 1 所以有的人直接记录该区间是否被覆盖过的方法是错误的 正确方法应该是记录这段区间的最小高度(就是最接近初始位置的高度),和最小高度对应的最长左区间和右区间 开一个sum记录这段区间最小高度的块数,min_v 记录该区间最小高度 cover

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {