方法: factorial mod, logarithm

求trailing zeros,其实就是factorial mod 的应用,

求长度,利用log 函数。需要注意的是,答案为int(log(n!)/log(b)) + 1, 比如 a = 2, b = 2, 长度为2.

code:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#include <fstream>
#include <cassert>
#include <unordered_map>
#include <cmath>
#include <sstream>
#include <time.h>
#include <complex>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define FOR(a,b,c) for (int (a)=(b);(a)<(c);++(a))
#define FORN(a,b,c) for (int (a)=(b);(a)<=(c);++(a))
#define DFOR(a,b,c) for (int (a)=(b);(a)>=(c);--(a))
#define FORSQ(a,b,c) for (int (a)=(b);(a)*(a)<=(c);++(a))
#define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a))
#define FOREACH(a,b) for (auto &(a) : (b))
#define rep(i,n) FOR(i,0,n)
#define repn(i,n) FORN(i,1,n)
#define drep(i,n) DFOR(i,n-1,0)
#define drepn(i,n) DFOR(i,n,1)
#define MAX(a,b) a = Max(a,b)
#define MIN(a,b) a = Min(a,b)
#define SQR(x) ((LL)(x) * (x))
#define Reset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(v) v.begin(),v.end()
#define ALLA(arr,sz) arr,arr+sz
#define SIZE(v) (int)v.size()
#define SORT(v) sort(all(v))
#define REVERSE(v) reverse(ALL(v))
#define SORTA(arr,sz) sort(ALLA(arr,sz))
#define REVERSEA(arr,sz) reverse(ALLA(arr,sz))
#define PERMUTE next_permutation
#define TC(t) while(t--)
#define forever for(;;)
#define PINF 1000000000000
#define newline '\n'#define test if(1)if(0)cerr
using namespace std;using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> ii;
typedef pair<double,double> dd;
typedef pair<char,char> cc;
typedef vector<ii> vii;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> l4;
const double pi = acos(-1.0);int a, b;
bitset<2000001> vis(0);
ll primes[2000001];
int pcnt = 0;// said to be O(n) prime generating
void init()
{for (ll i = 2; i <= 2e6; ++i){if (!vis[i]) primes[pcnt++] = i;for (int j = 0; j < pcnt && i * primes[j] <= 2e6; ++j){vis[j*primes[j]] = true;if (i % primes[j] == 0) break;}}
}int main()
{init();while (cin >> a >> b){int ans = 1e9;int B = b;for (int i = 0; i < pcnt && b >= primes[i]; ++i){if (b % primes[i]) continue;int bcnt = 0;while (b % primes[i] == 0){b /= primes[i];bcnt += 1;}int fcnt = 0;int cur = a;while (cur){cur /= primes[i];fcnt += cur;}ans = min(ans, fcnt/bcnt);}double len = 0;for (int i = 2; i <= a; ++i){len += log(1.0*i);}cout << ans << " " << max((int)(len/log(B)+1),1) << newline;}
}

  

(我的笨办法)求trailing zero's 的长度,用一个数组记录下factorial里各个prime的power,然后用另一个数组记录下b里各个prime的power,然后求解。

code:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#include <fstream>
#include <cassert>
#include <unordered_map>
#include <cmath>
#include <sstream>
#include <time.h>
#include <complex>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define FOR(a,b,c) for (int (a)=(b);(a)<(c);++(a))
#define FORN(a,b,c) for (int (a)=(b);(a)<=(c);++(a))
#define DFOR(a,b,c) for (int (a)=(b);(a)>=(c);--(a))
#define FORSQ(a,b,c) for (int (a)=(b);(a)*(a)<=(c);++(a))
#define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a))
#define FOREACH(a,b) for (auto &(a) : (b))
#define rep(i,n) FOR(i,0,n)
#define repn(i,n) FORN(i,1,n)
#define drep(i,n) DFOR(i,n-1,0)
#define drepn(i,n) DFOR(i,n,1)
#define MAX(a,b) a = Max(a,b)
#define MIN(a,b) a = Min(a,b)
#define SQR(x) ((LL)(x) * (x))
#define Reset(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(v) v.begin(),v.end()
#define ALLA(arr,sz) arr,arr+sz
#define SIZE(v) (int)v.size()
#define SORT(v) sort(all(v))
#define REVERSE(v) reverse(ALL(v))
#define SORTA(arr,sz) sort(ALLA(arr,sz))
#define REVERSEA(arr,sz) reverse(ALLA(arr,sz))
#define PERMUTE next_permutation
#define TC(t) while(t--)
#define forever for(;;)
#define PINF 1000000000000
#define newline '\n'#define test if(1)if(0)cerr
using namespace std;using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> ii;
typedef pair<double,double> dd;
typedef pair<char,char> cc;
typedef vector<ii> vii;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> l4;
const double pi = acos(-1.0);int a, b;
int d[2000001] = {0};
int cnt[2000001];
int fcnt[2000001];
void init()
{d[1] = 1;for (ll i = 2; i <= 2e6; ++i){if (!d[i]){d[i] = (int)i;for (ll j = i*i; j <= 2e6; j += i)d[j] = (int) i;}}
}int main()
{init();while (cin >> a >> b){Reset(cnt, 0);int ans = 0;double len = 0;for (int i = 2; i <= a; ++i){len += log(1.0*i);int cur = i;while (cur != 1){cnt[d[cur]] += 1;cur /= d[cur];}}Reset(fcnt, 0);int cur = b;while (cur != 1){fcnt[d[cur]] += 1;cur /= d[cur];}ans = 1e9;for (int i = 2; i <= b; ++i)if (fcnt[i]){ans = min(ans, cnt[i]/fcnt[i]);//cerr << i << " " << cnt[i] << " " << fcnt[i] << newline;}cout << ans << " " << max((int)(len/log(b)+1),1) << newline;}
}

  

转载于:https://www.cnblogs.com/skyette/p/6357348.html

UVa 10061 How many zero's and how many digits?相关推荐

  1. uva 10061——How many zero\'s and how many digits ?

    题意:这道题开始是卡了很久的,题意是给定一个数n然后让你求B进制下n!有多少个零,和有多少位数,咋一看,是高精度,如果数论不是很熟系. 思路:开始是直接抛弃高精度的一来是存不下,二来没办法短时间计算出 ...

  2. UVA - 10061 How many zero#39;s and how many digits ?

    n!=x*b^y, 当x为正整数时,最大的y就是n!末尾0的个数了, 把n,b分别拆成素因子相乘的形式: 比如, n=5,b=16 n=5,b=2^4, 非常明显,末尾0的个数为0 10进制时,n!= ...

  3. Uva 10061 进制问题

    题目大意:让求n!在base进制下的位数以及末尾0的连续个数. 多少位 log_{10}256=log_{10}210^2+log_{10}510^1+log_{10}6*10^0 可以发现,只和最高 ...

  4. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  5. [搜索]UVa 129 困难的串

    题意:将一个包含两个相邻的重复子串的子串,称为"容易的串",其他为"困难的串". 输入正整数n和l,输出由前l个字符组成的,字典序第n小的困难的串. 输入样例: ...

  6. uva 401.Palindromes

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  7. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  8. UVA 11752 超级幂

    UVA 11752 超级幂 Z - The Super Powers Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & ...

  9. UVa 11174 - Stand in a Line

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

最新文章

  1. 中国互联网+光伏发电行业商业模式创新与投资机会深度研究报告
  2. Java爬虫——B站弹幕爬取
  3. JavaEE笔记(五)
  4. Android移动端音视频的快速开发教程(五)
  5. Sightseeing Cows POJ - 3621
  6. java文件全是数字编码_批量将Java源代码文件的编码从GBK转为UTF-8
  7. execl按数值分类
  8. 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
  9. 面向初学者的图形数据库:为什么我们需要NoSQL数据库,ACID与BASE的解释说明
  10. python最简单的爬取邮箱地址怎么写_详解python定时简单爬取网页新闻存入数据库并发送邮件...
  11. 单片机课设中期报告_毕业设计中期报告
  12. android安卓使用socketIO实现聊天室功能
  13. Meltdown Reading Kernel Memory from User Space
  14. Unity 预定义标签
  15. Panoramic Photography
  16. Acwing 1191. 家谱树 (topsort
  17. win10升级win11(cpu/tpm不符合)亲测有效,保留数据
  18. 离线三维地球安卓解决方案
  19. 解释计算机概念BIOS,电脑BIOS的小常识
  20. s7 200 c语言编程,s7 200 子程序 局部变量表

热门文章

  1. android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...
  2. Ubuntu 开机 Firmware Bug , Bios corrupted
  3. 【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
  4. 【转】译文:.net 程序员易犯的7个通病
  5. future promise java_第四章 Future和Promise
  6. C++基础( C++初识、数据类型、运算符、程序流程结构、)
  7. php中定义css样式的好处,CSS的优点和缺点分别是什么
  8. Java GUI 基础知识2 监听机制
  9. flutter 透明度动画_Flutter中的动画填充+不透明度动画✨
  10. c# ui 滚动 分页_UI备忘单:分页,无限滚动和“加载更多”按钮