n!素因子p的幂 swjtuOJ 2090【数论】
2024-10-08 02:16:40
原文地址:http://blog.csdn.net/u012717411/article/details/47334969(感谢作者)
素因子分解写的非常好!
数论一道好题:给以两个大整数n,s(n<=10^18,s<=10^12),试找到最大的整数k使得n! % s^k ==0
- (1)首先对S进行素因子分解,复杂度O(logN),用map存储,得到所有素因子以及素因子的幂
- (2)对于每一个素因子p,计算对应的n!中素因子p的幂(复杂度O(logn)),两者相除取所有p幂的最小值就是对应的最大整数k,总的时间复杂度为O(logs·logn)
❤求n!素因子p的幂要用累除法呀( ⊙ o ⊙ )!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int _max=1e3+;
ll n,s,t;
map<ll,int> mp;
map<ll,int>::iterator it; void divide(ll n)
{
mp.clear();
t=;
for(ll i=;i*i<=n;i++){
if(n%i==){
mp[i]++;
n/=i;
while(n%i==){
mp[i]++;
n/=i;
}
}
}
if(n!=) mp[n]++;
} ll judge(ll p){
ll cnt=;
ll now=n;
while(now){
cnt+=now/p;
now/=p;
}
return cnt;
} ll solve()
{
ll ans= 9223372036854775807ll;
for(it=mp.begin();it!=mp.end();it++){
ans=min(judge(it->first)/it->second,ans);
}
return ans;
} int main()
{
int T;
cin>>T;
while(T--){
scanf("%lld%lld",&n,&s);
divide(s);
printf("%lld\n",solve());
}
return ;
}
最新文章
- insert into output使用
- AC日记——单词翻转 1.7 27
- Java中正则Matcher类的matches()、lookAt()和find()的区别
- Java7并发编程实战(一) 线程的等待
- AIX扩展文件系统的大小
- webservice原理
- Mybatis 中常用的java类型与jdbc类型
- Oracle中排序列中值相同引发的问题(译)
- (转)了解了这些才能开始发挥jQuery的威力
- 上传图片代码(chuantouxiang.php+touxiangchuli.php)
- MySQL中CASE的使用
- 脚本+批处理打造IIS监控器
- 动易CMS-搜索结果页显示自定义字段
- 编程岗位电话面试问答Top 50[转]
- UVAlive-2554 Snakes &; Ladders---BFS状态的存储
- slab机制
- TypeScript专题-Static和使用技巧
- javascript中Math函数的属性与方法
- dubbo自定义异常传递信息丢失问题解决
- 19+ JavaScript 常用的简写技巧