【注:交大的看到这篇文章要学会自己写,不要为了比赛而比赛!~】
数论一道好题:给以两个大整数n,s(n<=10^18,s<=10^12),试找到最大的整数k使得n! % s^k ==0
数论一道不错的题目,很容易想到思路,但是数据会大一点,有可能爆long long ,笔者由于n!素因子p的幂采用累乘法,在10^12左右的一个素数爆掉了,QAQ
所以还是用累除法来的稳妥!
?求n!素因子p的幂要用累除法呀( ⊙ o ⊙ )!
/*====================================*|* n!素因子p的幂(累除法) *|
\*====================================*/
/*Author:Hacker_vision*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<climits>
#define clr(k,v) memset(k,v,sizeof(k))
#define ll long long
#define eps 1e-8
using namespace std;
const int _max = 1e3 + 10;
ll n,s,t;
map<ll,int>mp;
map<ll,int>::iterator it;
void divide(ll n){//素因子分解
mp.clear();
t = 0;
for(ll i = 2; i * i <= n; ++ i){
if(n%i==0){
mp[i]++;
n/=i;
while(n%i==0){
mp[i]++;
n/=i;
}
}
}
if(n!=1) mp[n]++;
}
ll judge(ll p){//n!素因子分解素数p的幂,累除法
ll cnt= 0;
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(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
int T;cin>>T;
while(T--){
scanf("%lld%lld",&n,&s);
divide(s);
printf("%lld\n",solve());
}
return 0;
}
Ctrl + B
Ctrl + I
Ctrl + Q
Ctrl + L
Ctrl + K
Ctrl + G
Ctrl + H
Ctrl + O
Ctrl + U
Ctrl + R
Ctrl + Z
Ctrl + Y
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u012717411/article/details/47334969