【时光回溯】【JZOJ3566】【GDKOI2014】阶乘
题目描述
输入
第一行有一个正整数T,表示测试数据的组数。
接下来的T行,每行输入两个十进制整数n和base。
输出
对于每组数据,输出一个十进制整数,表示在base进制下,n!结尾的零的个数。
样例输入
2
10 10
10 2
样例输出
2
8
数据范围
对于20%的数据,n<=20,base<=16
对于50%的数据,n<=10^9,base<=10^5
对于100%的数据,1<=T<=50,0<=n<=10^18,2<=base<=10^12
解法
题意转化为:令n!=basei∗k,则i为答案;
同时称i为base在n!中的贡献。
直接想法是把base分解质因数为a1k1∗a2k2∗...∗amkm;
然后检查每个质因数ai在n!中的贡献 cnt,于是就可以得出这个质因数最多容纳cnt/ki个base。
把所有容纳能力取个最小值即为答案。
问题在于我们在求ai在n!中的贡献时,可能需要O(nlogn)的时间:
枚举j属于[1..n],易得ai在j中的贡献,累计所有贡献即为ai在n!中的贡献。
如果采用上述办法,时间会超限。
给n一直除素数,并将每一次的商加起来,即为答案。
时间复杂度为O(logn);
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) int(log(x)/log(y))
using namespace std;
const char* fin="ex3566.in";
const char* fout="ex3566.out";
const int inf=0x7fffffff;
const int maxn=100007;
ll n,m,limit,tmp,tmd,tmb,ans;
ll t,i,j,k;
ll yue[maxn],cnt[maxn];
int main(){
scanf("%d",&t);
for (;t;t--){
scanf("%lld%lld",&n,&m);
limit=(ll)sqrt(m);
tmp=m;
yue[0]=0;
for (i=2;i<=limit;i++){
if (tmp==1) break ;
if (tmp%i==0){
yue[++yue[0]]=i;
cnt[yue[0]]=0;
while (tmp%i==0){
cnt[yue[0]]++;
tmp/=i;
}
}
}
if (tmp>1) yue[++yue[0]]=tmp,cnt[yue[0]]=1;
ans=0;
for (i=1;i<=yue[0];i++) {
//ll num=(n/yue[i]),fi=1,la=fi+num-1;
tmd=0;
/*for (j=yue[i];j<=n;j+=yue[i]) {
k=j;
while (k%yue[i]==0) k/=yue[i],tmd++;
}*/
k=n;
while (k) k/=yue[i],tmd+=k;
if (ans) ans=min(ans,tmd/cnt[i]);
else ans=tmd/cnt[i];
/*if (ans) ans=min(ans,(fi+la)*num/2/cnt[i]);
else ans=(fi+la)*num/2/cnt[i];*/
}
printf("%lld\n",ans);
}
return 0;
}
启发
考虑把所有数一起处理,可以节省时间。
【时光回溯】【JZOJ3566】【GDKOI2014】阶乘的更多相关文章
- 【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划
题目描述 输入 输出 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. 样例输入 2 3 6 1 5 1 2 1 2 3 2 5 4 5 4 3 2 1 3 1 1 ...
- 【时光回溯】【JZOJ3571】【GDKOI2014】内存分配
题目描述 输入 输出 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位数. 样例输入 2 3 1 4 1 4 2 2 1 2 1 1 1 1 1 样例输出 2 3 1 数据范围 ...
- 【时光回溯】【JZOJ3568】【GDKOI2014】小纪的作业题
题目描述 输入 输出 有M行,每个询问一行,输出结果mod 1,000,000,007的值. 样例输入 10 3 3 5 1 2 3 1 3 5 2 1 7 9 3 9 2 3 样例输出 10 19 ...
- 25个 Git 进阶技巧
[ 原文] http://www.open-open.com/lib/view/open1431331496857.html 我已经使用git差不多18个月了,觉得自己对它应该已经非常了解.然后来自G ...
- git基本技巧及进阶
基本技巧 1. 安装后的第一步 在安装好git后,你第一件该做的事是设置你的名字和电子邮箱,因为每次提交都要用到这些信息: $ git config --global user.name " ...
- Git技巧总结分享
接触Git有很长一段时间了,从最初的不懂到逐渐熟悉运用,相比于SVN,更热衷于Git这一款强大的版本控制工具. 废话不多说,下面对Git做了一些技巧总结,在此分享下,希望能帮助到一些喜欢Git的朋友们 ...
- 【BZOJ】【3052】【WC2013】糖果公园
树分块 老早(大约一个月以前?)就听说这道神题了……orz rausen 一直拖到现在才做……发现还是不会呢= = 只好也去Orz了Hzwer和zky http://hzwer.com/5250.ht ...
- HTTP/2 对 Web 性能的影响(上)
一.前言 HTTP/2 于 2015 年 5 月正式推出.自诞生以来,它就一直在影响着网络性能最佳实践.在本篇文章中,我们将讨论 HTTP/2 的二进制帧.延迟削减.潜在利弊以及相应的应对措施. 超文 ...
- [USACO 2010 Open Silver 3.Time Travel]——链表
Description 约翰得到了一台时光机,他可以用这台机器回到过去(但不能到未来),改变他家的牛群.约翰 打算依次进行 N 步操作,每步操作分为三种: • 买入操作以 a 表示,后接一个参数 i, ...
随机推荐
- CODE[VS]4633:Mz树链剖分练习
Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a= ...
- 19-10-19-I
中午考试困够呛. T1 我想打矩阵快速幂,然后我咕了 T2 打T1了所以又咕了. T3 每一个黑点更新答案只有两种方式: 更新子树. 更新父链上的兄弟,叔伯,…… 于是: 把树拍在$DFS$序上. 更 ...
- 玩转python爬虫之正则表达式
玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...
- vim用户设置
此配置目前使用户mac,linux,win,但是win系统需要提前配置mingw32相关的gcc系统路径等信息. " Setting some decent VIM settings for ...
- WhaleCTF之web-Find me
WhaleCTF之web-Find me 前往题目 Where is the flag?这是给我提示吗? 没思路,看看源码,说不定有惊喜 哇,在这里啊,得到flag~ flag:{This_is_s0 ...
- Python爬虫笔记【一】模拟用户访问之设置处理cookie(2)
学习的课本为<python网络数据采集>,大部分代码来此此书. 做完请求头的处理,cookie的值也是区分用户和机器的一个方式.所以也要处理一下cookie,需要用requests模块,废 ...
- SDI在自定义的工具栏上添加下拉控件
0.首先到自己的工具条上新建一个控件,并命名新ID 1.拷贝FlatComboBox.h和FlatComboBox.cpp到工程目录下 2.建立新类 class CTrackerToolBar : p ...
- python 当文件目录不存在时,如何自动创建
import os if not os.path.exists('foldername'): os.mkdir('foldername')
- Redis 核心
一.Redis单机多实例原理 每个实例对应不同的配置文件,配置文件对应不同的端口.数据库文件位置.日志位置. 二.Redis单实例多数据库 每个Redis实例都有16个数据库,下标从0-15,当 se ...
- android 数据绑定(3)自动更新UI
1.官方文档 https://developer.android.com/topic/libraries/data-binding/observability 2.observable 属性 适合对象 ...