您的位置:首页 > 其它

neu 1694 Primorial vs LCM 数论

2016-05-13 00:23 441 查看

1694:PrimorialvsLCM

时间限制:4Sec内存限制:128MB
[提交][状态][讨论版]

题目描述

GivenN(2<=N<=10^14),whatisthequotientofLCM(1,2,3,....,N)dividedbymultipleofallprimesup
toN.Astheresultmightbetoobig,outputit'smoduloby1000000007.
Forexample,whenN=5,theresultisLCM(1,2,3,4,5)/(2*3*5)=60/30=2.
NotethatLCMstandsforLowestorLeastCommonMultiple.

输入

ThefirstlineoftheinputisT(T≤50000),thenTtestcasesfollowsinnextTlines.Eachline
containsanintegerN(2≤N≤100000000000000or10^14).ThemeaningofNisgiveninthe
problemstatement.

输出

Foreachtestcaseprintalinein“Casex:S”formatwherexiscasenumberandSisthe
quotientmoduloby1000000007.

样例输入

10
2
3
4
5
6
7
8
9
10
1000

样例输出

Case1:1
Case2:1
Case3:2
Case4:2
Case5:2
Case6:2
Case7:4
Case8:12
Case9:12
Case10:744593350
思路:显然是求小于一个素数的n次方小于N的贡献为那个素数的n-1次方;
   因为一次方是没用的,所以素数打表到sqrt(e14);
   求出前缀积,二分查找位置;
   注意超内存跟,得到贡献那里必须要double;


#include<bits/stdc++.h>
usingnamespacestd;
#definellunsignedlonglong
#definemod1000000007
#defineinf100000000000005
#defineMAXN10000010
//#pragmacomment(linker,"/STACK:102400000,102400000")
intscan()
{
intres=0,ch;
while(!((ch=getchar())>='0'&&ch<='9'))
{
if(ch==EOF)return1<<30;
}
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch-'0');
returnres;
}
vector<pair<ll,ll>>v;
vector<ll>ans;
llprime[MAXN],cnt;
boolvis[MAXN];
voidPrime()
{
cnt=0;
memset(vis,0,sizeof(vis));
v.push_back(make_pair(1LL,1LL));
for(lli=2;i<MAXN;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(doublej=(double)i*i;j<inf;j*=i)
v.push_back(make_pair((ll)j,i));
}
for(llj=0;j<cnt&&i*prime[j]<MAXN;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
sort(v.begin(),v.end());
ans.push_back(1LL);
for(inti=1;i<v.size();i++)
ans.push_back((ans[i-1]*v[i].second)%mod);
}
intmain()
{
llx,y,z,i,t;
Prime();
intT,cs=1;
scanf("%d",&T);
while(T--)
{
scanf("%llu",&x);
llst=0;
llen=v.size()-1;
while(st<en)
{
llmid=(st+en)/2;
if(v[mid].first>x)
en=mid;
else
st=mid+1;
}
if(x>=v[st].first)
printf("Case%d:%llu\n",cs++,ans[st]%mod);
elseif(x>=v[st-1].first)
printf("Case%d:%llu\n",cs++,ans[st-1]%mod);
}
return0;
}


ViewCode


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