您的位置:首页 > 其它

uva10820 - Send a Table 欧拉函数

2013-11-23 10:28 471 查看
ProblemA

SendaTable

Input:
StandardInput
Output:StandardOutput

Whenparticipatinginprogrammingcontests,yousometimesfacethefollowingproblem:Youknowhowtocalcutaletheoutputforthegiveninputvalues,butyouralgorithmiswaytooslowtoeverpassthetimelimit.Howeverhardyoutry,youjustcan'tdiscoverthe
properbreak-offconditionsthatwouldbringdownthenumberofiterationstowithinacceptablelimits.

Nowiftherangeofinputvaluesisnottoobig,thereisawayoutofthis.LetyourPCrattleforhalfanourandproduceatableofanswersforallpossibleinputvalues,encodethistableintoaprogram,submitittothejudge,etvoila:Acceptedin0.000
seconds!(Somewouldarguethatthisischeating,butremember:Inloveandprogrammingcontestseverythingispermitted).

Facedwiththisproblemduringoneprogrammingcontest,Jimmydecidedtoapplysucha'technique'.Buthoweverhardhetried,hewasn'tabletosqueezeallhispre-calculatedvaluesintoaprogramsmallenoughtopassthejudge.Thesituationlookedhopeless,
untilhediscoveredthefollowingpropertyregardingtheanswers:theanswerswherecalculatedfromtwointegers,butwheneverthetwoinputvalueshadacommonfactor,theanswercouldbeeasilyderivedfromtheanswerforwhichtheinputvaluesweredividedby
thatfactor.Toputitinotherwords:

SayJimmyhadtocalculateafunctionAnswer(x,y)wherexandyarebothintegersintherange[1,N].WhenheknowsAnswer(x,y),hecaneasilyderiveAnswer(k*x,k*y),wherekisanyintegerfromitbyapplyingsomesimplecalculationsinvolvingAnswer(x,
y)andk.ForexampleifN=4,heonlyneedstoknowtheanswersfor11outofthe16possibleinputvaluecombinations:Answer(1,1),Answer(1,2),Answer(2,1),Answer(1,3),Answer(2,3),Answer(3,2),Answer(3,1),Answer(1,4),Answer(3,4),Answer(4,3)
andAnswer(4,1).Theother5canbederivedfromthem(Answer(2,2),Answer(3,3)andAnswer(4,4)fromAnswer(1,1),Answer(2,4)fromAnswer(1,2),andAnswer(4,2)fromAnswer(2,1)).NotethatthefunctionAnswerisnotsymmetric,soAnswer(3,2)cannot
bederivedfromAnswer(2,3).

Nowwhatwewantyoutodois:foranyvaluesofNfrom1uptoandincluding50000,givethenumberoffunctionJimmyhastopre-calculate.

Input

Theinputfilecontainsatmost600linesofinputs.Eachlinecontainsanintegerlessthan50001whichindicatesthevalueofN.Inputisterminatedbyalinewhichcontainsazero.Thislineshouldnotbeprocessed.

Output

Foreachlineofinputproduceonelineofoutput.ThislinecontainsanintegerwhichindicateshowmanyvaluesJimmyhastopre-calculateforacertainvalueofN.

SampleInputOutputforSampleInput

2

5

0


3

19

φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1,p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。(注意:每种质因数只一个。比如12=2*2*3。
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以φ(n)表示不超过n且与n互
素的正整数的个数,称为n的欧拉函数值,这里函数
φ:N→N,n→φ(n)称为欧拉函数。
若m,n互质,φ(mn)=φ(m)φ(n)。
特殊性质:当n为奇数时,φ(2n)=φ(n)。

以上这一段来自百度百科。

打出欧拉公式的表也就比快速打素数表多出一步,找到素数p后把这个素数的倍数x都标记(如果x没有访问过,就先把phi[x]赋值为x),由于x有素因子p,所以要乘以(1-1/p),也就是除以p再乘(p-1)(注意最好是先除再乘,防止越界)。最后把小于等于要求值的素数都找一遍后,每个φ(x)就都求出来了。

这道题求的是小于等于N的互素对数,所以打完表后要递推一下,phi[i]=phi[i-1]+phi[i],再就是一组两个数交换位置也算,所以答案要乘以2,(1,1)是特例,要再减去1。

#include<cstring>
#include<cstdio>
#include<iostream>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#defineINF0x3f3f3f3f
usingnamespacestd;
intN,phi[50010],M=50010;
voidphi_table(){
memset(phi,0,sizeof(phi));
inti,j;
phi[1]=1;
for(i=2;i<=M;i++)if(!phi[i]){
for(j=i;j<=M;j+=i){
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
intmain(){
//freopen("in.txt","r",stdin);
phi_table();
inti;
for(i=2;i<=M;i++)phi[i]=phi[i]+phi[i-1];
while(scanf("%d",&N),N){
printf("%d\n",phi
*2-1);
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: