数论-质数 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少,所以 ...
随机推荐
- emptyDir与hostPath
目录 Volume类型 emptyDir hostPath Volume类型 volume是kubernetes Pod中多个容器访问的共享目录.volume被定义在pod上,被这个pod的多个容器挂 ...
- LR和SVM的区别
一.相同点 第一,LR和SVM都是分类算法(SVM也可以用与回归) 第二,如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的. 这里要先说明一点,那就是LR也是可以用核 ...
- Golang面向过程编程-函数
Golang面向过程编程-函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字,所有的 ...
- springboot下实现邮件发送功能
springboot给我们封装好了邮件功能,非常简单,只需要稍微配置下就ok. 引入jar <dependency> <groupId>org.springframework. ...
- javascript 5秒后关闭广告案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Hbase记录-HBase基本操作(一)
HBase创建表 可以使用命令创建一个表,在这里必须指定表名和列族名.在HBase shell中创建表的语法如下所示. create ‘<table name>’,’<column ...
- IoC之Ninject
一.Ninject安装 Ninject是一个轻量级的开源的DI容器,可以通过Nuget直接安装: 二.Ninject的简单使用 模型代码: //计算器接口 public interface ICalc ...
- Uva439:BFS题目总结
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <cstd ...
- 八皇后问题动态演示_Qt5实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
- 16. Spring boot 错误页面
默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 { "timestamp& ...