洛谷10月月赛R1T1-SAC E#1 - 一道中档题 Factorial(pollard-rho质因数分解)

2024-02-05 15:18

本文主要是介绍洛谷10月月赛R1T1-SAC E#1 - 一道中档题 Factorial(pollard-rho质因数分解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门
小数据做法(改了之后):http://blog.csdn.net/stone41123/article/details/78172763
大数据做法(没改之前的数据范围):
我们沿用之前的做法,只是质因数分解如果再用 O(n) 的,那么就会TLE
我们可以使用pollard-rho质因数分解,听说时间是 O(n14) 的,我自己强化了数据跑了一下,0ms,快到飞起
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#define ll long long
using namespace std;
typedef ll Tem;
inline Tem read(){Tem x=0;char ch=' ';int f=1;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
const int times=10;
inline ll mul(ll a,ll b,ll p){a%=p;b%=p;ll ans=0;while(b){if(b&1){ans=(ans+a)%p;}a=(a+a)%p;b>>=1;}return ans;
}
inline ll ksm(ll a,ll b,ll p){a%=p;ll ans=1;while(b){if(b&1){ans=mul(ans,a,p);}a=mul(a,a,p);b>>=1;}return ans;
}
inline bool miller_rabin(ll n){if(n==2)return true;if(n<2||(!(n&1)))return false;ll m=n-1;ll k=0;while(!(m&1)){m>>=1;k++;}for(int i=1;i<=times;i++){ll a=rand()%(n-1)+1;ll x=ksm(a,m,n);for(int j=1;j<=k;j++){ll y=mul(x,x,n);if(y==1&&x!=1&&x!=n-1)return false;x=y;}if(x!=1)return false;}return true;
}
inline ll gcd(ll a,ll b){if(a==0)return 1;if(a<0)return gcd(-a,b);ll t;while(b){t=a%b;a=b;b=t;}return a;
}
ll fac[10001],cnt;
inline ll pollard_rho(ll n,ll c){ll i=1,k=2;ll x0=rand()%(n-1)+1;ll y=x0;while(1){i++;x0=(mul(x0,x0,n)+c)%n;ll d=gcd((y-x0+n)%n,n);if(1<d&&d<n)return d;if(y==x0)return n;if(i==k){y=x0;k<<=1;}}
}
inline void findfac(ll n,ll c){if(n==1)return;if(miller_rabin(n)){fac[++cnt]=n;return;}ll p=n;ll cc=c;while(p>=n)p=pollard_rho(p,c--);findfac(p,cc);findfac(n/p,cc);
}
ll n,k,ans;
ll prime[10001],e[10001],tot;
int main(){n=read();k=read();findfac(k,23333);sort(fac+1,fac+cnt+1);for(int i=1;i<=cnt;i++){if(fac[i]==prime[tot]){e[tot]++;}else{e[++tot]=1;prime[tot]=fac[i];}}ans=100000000000000000LL;for(int i=1;i<=tot;i++){ll num=0,now=prime[i];if(now>n)break;while(now<=n){num+=n/now;now*=prime[i];}num/=e[i];ans=min(ans,num);}if(ans==100000000000000000LL)ans=0;printf("%lld",ans);return 0;
}

这篇关于洛谷10月月赛R1T1-SAC E#1 - 一道中档题 Factorial(pollard-rho质因数分解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681326

相关文章

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

每天一道面试题(2):fail-safe 机制与 fail-fast 机制分别有什么作用?

当谈论Java集合的 fail-fast 和 fail-safe 机制时,涉及的是在集合被并发修改时的行为和处理方式。这些机制对保证程序的正确性和稳定性非常重要,尤其是在多线程环境中。 1. Fail-Fast 机制 定义: Fail-fast 机制的核心是在检测到集合在遍历过程中被修改时,立即抛出 ConcurrentModificationException 异常,从而中断迭代操作。这种

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

一道算法题引发的动态内存管理的思考

在做PKU2762时,需要建邻接表。 于是按部就班写了下面一个插入边到邻接表中的函数: const int VMAX = 1010;typedef struct Graph{int vex;Graph* next;}Graph;Graph ArcGraph[VMAX];void insert(int u, int v){Graph* t = new Graph;Graph*

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

一道简单的C语言嵌套

最后的答案是  哈哈 val=8

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

高级java每日一道面试题-2024年9月03日-JVM篇-怎么判断对象是否可以被回收?

如果有遗漏,评论区告诉我进行补充 面试官: 怎么判断对象是否可以被回收? 我回答: 在Java中,判断一个对象是否可以被垃圾回收器(Garbage Collector, GC)回收,主要涉及到Java的内存管理和垃圾回收机制。Java采用自动内存管理机制,其中垃圾回收器负责识别并回收那些不再被应用程序使用的对象所占用的内存空间。要深入理解对象何时可以被回收,我们需要关注以下几个方面: 1.