您的位置:首页 > Web前端 > JavaScript

bzoj2257 [Jsoi2009]瓶子和燃料

2017-09-13 18:38 239 查看
题目

一道数学题。

结论:首先易知k个瓶子能导出的油最小值一定是k个瓶子容量的最大公因数 于是问题转化成了在n个数中选择k个使最大公因数最大。

所以把每个数分解因数,选出公因数个数大于等于k中最大的,即可。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
#define MAXV 1000000000
#define LL long long
using namespace std;
bool P[100001];
int prime[100001],size;
map <LL,int>E;
map <LL,int>::iterator id;
LL ans;
LL n,k,x;
void read(LL &x)
{
char c;
x=0;
c=getchar();
if(c==-1)return;
while(c>'9'||c<'0')c=getchar();
while(c<='9'&&c>='0')x=x*<
4000
span class="hljs-number">10+c-'0',c=getchar();
}
LL ksm(LL a,LL b,LL c)
{
LL ans=1;
a=a%c;
while(b)
{
if(b&1)ans=ans*a%c;
a=a*a%c;
b=b>>1;
}
return ans;
}
bool is_P(LL x)
{
if(x==1)return false;
if(x==2)return true;
if(x==5)return true;
if(x==13)return true;
if(ksm(2,x-1,x)!=1)return false;
if(ksm(5,x-1,x)!=1)return false;
//if(ksm(13,x-1,x)!=1)return false;
return true;
}
void divide(LL x)
{
if(is_P(x)){E[x]++;return;}
for(int i=1;i<=sqrt(x);i++)
{
if(x%i==0)E[i]++;
if(x%i==0&&i!=x/i)E[x/i]++;
}
}
int main()
{
memset(P,true,sizeof(P));
P[1]=false;
for(int i=2;i<=100000;i++)
{
if(P[i])
{
if(i<=100000/i)
{
for(int j=i*i;j<=100000;j+=i)
P[j]=false;
}
}
}
for(int i=1;i<=100000;i++)
if(P[i])prime[++size]=i;
read(n),read(k);
for(int i=1;i<=n;i++)
{
read(x);
divide(x);
}
ans=1;
for(id=E.begin();id!=E.end();id++)
{
//cout<<id->first<<" "<<id->second<<endl;
if(id->second>=k)ans=max(ans,id->first);
}
cout<<ans;
return 0;
}



代码写的丑233.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: