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

相关文章

约瑟夫问题(Josephus Problem)4:第k个出列的人是谁

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/16813419 本文是论述约瑟夫问题的第四部分,约瑟夫问题的描述在第一部分,本文用到了第三部分的算法。请先阅读第一部分和第三部分。 现在要求输出第k个出列的人的编号。 由第三部分的算法分析可知,规模为i-1的队列的任意一人的编号为p,规

约瑟夫问题(Josephus Problem)3:谁最后一个出列

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/16813349 本文是论述约瑟夫问题的第三部分,约瑟夫问题的描述在第一部分。请先阅读第一部分。 现在要求输出最后一个出列的人的编号。 第一次见到这个问题是在我高一的时候,那时候搞NOIP,培训的时候碰到了这个题目,当时没想到好的方法,

libevent使用(二) ----- event_base 和 event

关于event_base 如果设置event_base使用锁,则可以安全的在多线程这使用它。 然而,其 事件循环则只能运行在一个线程中,如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。 建立默认的event_base struct event_base *event_base_new(void)//函数分配并返回一个新的具有默认设置的event_

Gotchiverse Alchemica 代币现已在Base上线

​ 朋友们大家好, 继 GHST 成功登陆 Base 之后,我们很高兴地宣布,Gotchiverse的 "Gotchus Alchemica " token 也将登陆 Base! 从今天起,你就可以通过我们由 Socket 协议提供的新链抽象技术,将 Alchemica(和 GLTR!)从 Polygon 转移到 Base。这一新机制让我们离推出 Gotchichain 更近

装箱(背包)问题(Packing Problem)

装箱问题也叫背包问题,简单来说,就是把小货物往大箱子里装,要如何才能装得多。个人常见的经历就是“装冰箱”,很有趣的现象就是常常感觉冰箱再也装不下了,但是经过一翻折腾之后又神奇的装下了。   从企业运作角度来看就是尽量让每个容器(仓库、车辆、集装箱、船等)装的尽量多,可以节约企业的费用。通常,装载率85%左右,使用装箱优化方法后,可以达到90~95%左右。海尔做过一个海运装箱的项目,节约了大量运

[HDU 5572] An Easy Physics Problem (点在线上判定+对称)

HDU - 5572 给定一个圆和圆外两个点 A和 B 现在有一个质点在 A处,有速度方向 V 其与圆的碰撞是弹性碰撞,问质点是否能经过 B 分情况讨论 如果射线不与圆相交,直接判定点是否在射线上如果射线与圆相交,那么列方程解出与原交点 并得出反弹的法线方程,然后以法线方程作对称 最后判断点是否在一条线段和一条射线上 作对称的话可以将点 A以法线作对称,然后再用撞击点和对

1619D New Year‘s Problem

题目链接:New Year's Problem 从题目的描述中很容易看出来这是一道二分的题目,那么怎么去考虑呢?首先最多选n-1个商店,那也就是说至少有一个商店要选两个人或以上,因此我们的check函数可以去一个个枚举商店,看看是否有一个商店满足两个人,然后每个人选的价值都要大于mid。 代码附上: #include <bits/stdc++.h>#define int long long

洛谷:P1001 A+B Problem

1. 题目链接 https://www.luogu.com.cn/problem/P1001 A+B Problem 2. 题目描述 输入两个整数a和b,输出它们的和。 输入:两个整数 输出:一个整数 3. 我提交的题解 /*https://www.luogu.com.cn/problem/P1001A+B Problem题目描述:输入两个整数a和b,输出它们的和。输入:两个整数

【C++17 之 .base() 函数实现正向和反向迭代器之间的交换,原理及代码展示】接上一p

在 C++17 之前,如果你有一个反向迭代器(std::reverse_iterator)并希望获取其对应的正向迭代器,你通常需要做一些额外的转换或维护额外的正向迭代器。然而,从 C++17 开始,std::reverse_iterator 提供了一个 .base() 成员函数,使得从反向迭代器获取其基础的正向迭代器变得更加直接。 std::reverse_iterator 的 .base()

hdu1016_Prime_Ring_Problem(经典dfs)

给定一个n,将1到n的数字填入一个圈中。相邻的数字之和必须为素数。输出有一个要求就是先将所有的情况的顺时针数列输出,之后将所有的情况的逆时针情况输出。开始的想法是必须将结果存起来才能使得输出满足要求。在编程过程中发现并不一定要将符合条件的结果存起来,因为在深度优先遍历的过程中每一位的可能情况是有小到大的所以所有的情况都能得到无论是顺时针的还是逆时针的都可以。而且满足题目的要求先顺时针后逆时针。对于