您的位置:首页 > 其它

数论 D - 寒假安排 --acdream ACdream原创群赛(12)のBUAA选拔赛

2014-06-04 20:13 399 查看
题:http://acdreamoj.sinaapp.com/

思路:By kuangbin

把K进行质因子分解下,就知道P(n,m) 中含有多少个该质因子了。

然后取最小值

比如 k = p1^k1 * p2^k2 …..pi^ki

如何求出P(n,m) 有多少个pi ,假如有x个,那么所有的 x/ki 求最小值就是答案了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<string>
#include<queue>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define eps 1e-7

int cnt;
int a[30],b[30];
void calc(ll k)
{
ll i,j;
for(i=2;i*i<=k;i++)
{
if(k%i==0)
{
a[cnt]=i;
b[cnt]=0;
while(k%i==0)
{
k/=i;
b[cnt]++;
}
cnt++;
}
}
if(k!=1)
{
a[cnt]=k;
b[cnt]=1;
cnt++;
}
}
int solve(ll n,int x)
{
ll sum=1;
int ans=0;
while(sum<=n)
{
sum*=x;
ans+=n/sum;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,m,k,i,j;
cin>>n>>m>>k;
cnt=0;
calc(k);
int mn=inf;
m=n-m;
for(i=0;i<cnt;i++)
{
int tn,tm;
tn=solve(n,a[i]);
tm=solve(m,a[i]);
tn-=tm;
tn/=b[i];
mn=min(tn,mn);
}
cout<<mn<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: