数论-质数 poj2689,阶乘分解,求阶乘的尾零hdu1124, 求尾零为x的最小阶乘
/*
要求出[1,R]之间的质数会超时,但是要判断[L,R]之间的数是否是素数却不用筛到R
因为要一个合数n的最大质因子不会超过sqrt(n)
所以只要将[2,sqrt(R)]之间的素数筛出来,再用这些素数去筛[L,R]之间的合数即可
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long ll L,R,ans[];
int v[],prime[],m,isprime[];
void init(int n){
memset(v,,sizeof v);
m=;
for(int i=;i<=n;i++){
if(v[i]==){
v[i]=i;
prime[++m]=i;
}
for(int j=;j<=m;j++){
if(prime[j]>v[i] || prime[j]>n/i) break;
v[i*prime[j]]=prime[j];
}
}
} int main(){
init();//打表求出[2,10^7]之内的质数
while(scanf("%lld%lld",&L,&R)==){
if(L==) L=;
memset(isprime,,sizeof isprime);
for(ll i=;i<=m;i++){
if(prime[i]>sqrt(R)+)break;//超过sqrt(R)的质数就不用筛了
for(ll j=(L-)/prime[i]+;prime[i]*j<=R;j++)
if(j>)isprime[prime[i]*j-L]=;
} ll L1,R1,L2,R2,Max=-,Min=,tot=;
for(ll i=;i<=R-L;i++)
if(!isprime[i]) ans[tot++]=i+L; if(tot<=) {
puts("There are no adjacent primes.");
continue;
}
for(int i=;i<tot;i++){
if(Max<ans[i]-ans[i-]){
Max=ans[i]-ans[i-];
L1=ans[i-],R1=ans[i];
}
if(Min>ans[i]-ans[i-]){
Min=ans[i]-ans[i-];
L2=ans[i-],R2=ans[i];
}
}
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",L2,R2,L1,R1);
}
}
/*阶乘分解:给定一个n,求分解n!的质因数,输出总共有多少质因数
思路:筛出1-N所有的质因数,质因数p在n!中出现的次数即p在1-n所有数中出现的次数之和,那么p出现了n/p次,p*p出现了n/p*p次,。。累加即可
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long int n,m,prime[],v[];
void init(int n){
memset(prime,,sizeof prime);
memset(v,,sizeof v);
m=;
for(int i=;i<=n;i++){
if(v[i]==){
v[i]=i;
prime[++m]=i;
}
for(int j=;j<=m;j++){
if(prime[j]>v[i] || prime[j]*i>n) break;
v[i*prime[j]]=prime[j];
}
}
} int main(){
init();
while(scanf("%d",&n)==){
ll ans=;
for(int i=;i<=m;i++){
if(prime[i]>n) break;
int j=prime[i];
while(j<=n){
ans+=n/j;
j*=prime[i];
}
}
printf("%d\n",ans);
}
}
//质数筛法
/*Era筛:
复杂度:O(nloglogn)非常接近线性
原理:任何质数x的倍数:2x,3x,...都是合数,优化后只要筛 >=x*x的数即可
*/
void primes(int n){
memset(v,,sizeof v);//合数标记
for(int i=;i<=n;i++){
if(v[i]) continue;
for(int j=i;i*j<=n;j++) v[i*j]=;
}
} /*
线性筛
复杂度:O(n)
原理:每个数只被它最小的数筛一次
*/
void primes(int n){
memset(v,,sizeof v);//每个数的最小质因子
memset(prime,,sizeof prime);//质数集合
m=;//质数数量
for(int i=;i<=n;i++){
if(v[i]==){//i是质数
v[i]=i;
prime[++m]=i;
}
for(int j=;j<=m;j++){
if(prime[j]>v[i] || prime[j]*i>n) break;//如果i有比prime[j]小的质因子,或者超出n范围
v[i*prime[j]]=prime[j];//prime[j]是i*prime[j]的最小质因子
}
}
} //质因数分解
/*
试除法
复杂度:O(sqrt(N))
原理:对于给定的n,枚举[2,sqrt(n)]中的每个数d,若n能整除d,则把n中所有的d除去
*/
void divide(int n){
memset(p,,sizeof p);//n的质因子
memset(c,,sizeof c);//个质因子的幂
m=;
for(int i=;i<=sqrt(n);i++){
if(n%i==){//i必定是质数
p[++m]=i,c[m]=;
while(n%i==)n/=i,c[m]++;
}
}
if(n>) p[++m]=n,c[m]=;//n是质数
}
hdu1124求阶乘的尾零
/*
阶乘求尾零
那就只要求出n!阶乘质因数分解后有多少2和5即可
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans,n,ans1,ans2;
int main(){
int T;
cin>>T;
for(int tt=;tt<=T;tt++){
cin>>n;
ans1=ans2=;
ll tmp=n;
while(n>=)
ans1+=n/,n/=;
while(tmp>=)
ans2+=tmp/,tmp/=;
ans=min(ans1,ans2);
cout<<ans<<endl;
}
}
light1138 二分答案,最后不要忘记验证答案,
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
ll n;
int judge(ll mid){
ll res=;
while(mid>=)
res+=mid/,mid/=;
if(res>=n)return ;
return ;
}
int main(){
int T;
cin>>T;
for(int tt=;tt<=T;tt++){
cin>>n;//要有n个5因子
ll mid,l=,r=,ans=-;
while(l<=r){
mid=l+r>>;
if(judge(mid))
ans=mid,r=mid-;
else l=mid+;
} if(ans!=-){
ll tmp=ans,cnt=;
while(tmp>=)
cnt+=tmp/,tmp/=;
if(cnt!=n)ans=-;
} if(ans!=-)
printf("Case %d: %lld\n",tt,ans);
else printf("Case %d: impossible\n",tt);
}
}
数论-质数 poj2689,阶乘分解,求阶乘的尾零hdu1124, 求尾零为x的最小阶乘的更多相关文章
- 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m
给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数 随后 ...
- LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子
http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分 ...
- luogu1445 [violet]樱花 阶乘分解
题目大意 求方程$$\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$$的正整数解的组数. 思路 咱们把式子整理得$$xy-(x+y)N!=0$$.$xy$和$x+y$?貌似可 ...
- Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)
Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...
- NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...
- 求包含每个有序数组(共k个)至少一个元素的最小区间
title: 求包含每个有序数组(共k个)至少一个元素的最小区间 toc: false date: 2018-09-22 21:03:22 categories: OJ tags: 归并 给定k个有序 ...
- AcWing 197. 阶乘分解 (筛法)打卡
给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pipi 和 cici 即可. 输入格式 一个整数N. 输出格式 N! 分解质因数后的结果,共若干行,每行一对pi, ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- LightOJ - 1138 (二分+阶乘分解)
题意:求阶乘尾部有Q(1 ≤ Q ≤ 108)个0的最小N 分析:如果给出N,然后求N!尾部0的个数的话,直接对N除5分解即可(因为尾部0肯定是由5*2构成,那么而在阶乘种,2的因子个数要比5少,所以 ...
随机推荐
- 元组&哈希&字典
1.元组(1)特性:不可变(不能修改.添加.删除),可以做切片 元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变(元组里套用列表,列表中的值可变)(2)功能: index count ...
- Python基础【day02】:数据运算(二)
本节内容 数据运算 表达式while 循环 一.数据运算 算数运算: 比较运算: 赋值运算: 逻辑运算: 成员运算: 身份运算: 位运算: #!/usr/bin/python a = 60 # 60 ...
- 学习Git笔记
一.名词解释 1.仓库(Repository) 仓库用来存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库. 2.收藏(Star) 收藏项目,方便下次查看 3.复制克隆项目(Fork) 该f ...
- weblogic/tomcat Get乱码【转】
引用自:http://www.cnblogs.com/1995hxt/p/4982835.html (非常清晰) 其它好文 tomcat和weblogic设置编码方式 tomcat解决方案 在con ...
- 解决Sublime Text中文标题出现异常情况
打开首选项-设置-用户 用以下覆盖原来配置,保存之后重新打开编辑器即可 { "dpi_scale": 1.0, "font_face" ...
- 20155319 2016-2017-2 《Java程序设计》第八周学习总结
20155319 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 NIO与NIO2 - NIO使用频道(channel)来衔接数据节点 - read()将Re ...
- android 简单文件操作
1.布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...
- Java SE 之 DAO层接口设计思想
用图说话 好处 1.只需要定义好IBaseDao的接口方法,并只需要实现BaseDaoImpl的方法,而具体的业务类和业务类/接口的方法的基本方法(IBaseDao已定义的)并不需要再考虑实现. 2. ...
- 【文件】java生成PDF文件
package test; import java.awt.Color; import java.io.FileOutputStream; import org.junit.Test; import ...
- adb环境变量配置
针对win10系统: 搜索“高级系统设置”,点击“环境变量”按钮: 找到“path”双击: 双击“path”,在弹出的环境变量列表中新建,填入adb的文件路径 检查配置是否成功,运行命令adb,出现如 ...