ÊýÂÛ»ù±¾Ä£ÐÍ ÏÂÔر¾ÎÄ

µÚ16ÕÂ

ÊýÂÛÎÊÌâ

³ÂÓÊýÂÛµÄÄ£°æ

ÔÚȺ¹²ÏíÀïµÄ ×Ô¼ºÕã´óÄ£°æÀïÓÐ

±¾Õ½«ÒªÌÖÂÛÔÚACM³ÌÐòÉè¼Æ¾ºÈüÖгöÏֱȽ϶àµÄÒ»ÀàÎÊÌ⣺ÊýÂÛÎÊÌâ¡£ÓÉÓÚÊýÂÛÎÊÌâÉæ¼°µÄÊýѧ֪ʶ±È½Ï¶à¡¢±È½ÏÉî°Â£¬²»ÄÜÔڶ̶̵ÄÒ»ÕÂÖÐÈ«²¿ÓèÒÔ½éÉÜ£¬Ö»ÄÜͨ¹ý½éÉÜһЩ°¸ÀýÀ´ËµÃ÷³£¼ûµÄÊýÂÛÎÊÌâ¡£

16.1 ÊýµÄÃÝÔËËã

ÓÐÒ»Àà³£¼ûµÄÔËË㣬¾ÍÊÇÇóÐÎÈçamodmµÄÖµ£¬Ò»°ãÇé¿öÏ£¬ÎÒÃÇ¿ÉÒÔÓÃÃݵĶ¨ÒåÀ´×ö£ºÍ¨¹ý³Ë·¨µÄ±¶³ËÀ´ÊµÏÖ£¬ÐèÒª×öb´Î³Ë·¨ºÍÄ£ÔËËã¡£Èç¹ûb±È½Ï´óʱ£¬ÕâÑùµÄ·½·¨¾Í²»ÐÐÁË£¬±¾½Ú½éÉÜÒ»ÖÖÖ»ÐèÒªO(log2b)´Î³Ë·¨ºÍÄ£ÔËËãµÄ·½·¨¡£

ÃݵļÆËã·½·¨

Ê×ÏȽ«Ö¸Êý±ä³É¶þµÄÃݴκ͵ÄÐÎʽ¡£Èç5=1+4=20+22£¬11=1+2+8=20+21+23¡£Èç¹ûb¿ÉÒÔ±íʾΪb?2b0?2b1???2bkµÄÐÎʽ£¬ÄÇôab¿ÉÒÔ±íʾΪ

ba?aib2b0?2b1???2bk?a2b0?2??a2b12bk

±íÃæÉÏ¿´ÕâÑùµÄ±í´ïʽ¸ü¸´ÔÓÁË£¬µ«×¢Òâµ½ÉÏÃæµÄ±í´ïʽµÄ³Ë»ýÏî²»³¬¹ý(log2b)£¬Í¬Ê±£¬ÐÎÈça2£¨i=0,1¡­.£©ÓÐÈçϵĵÝÍÆʽ£º

a2ii?1?a2??

i2Ò²¾ÍÊÇ˵£¬ºóÏî¿ÉÒÔͨ¹ýÇ°ÏîµÄƽ·½À´µÃµ½¡£ËùÒÔ¿ÉÒÔÏȽ«ÐÎÈça2£¨i=0,1¡­.£©µÄÖµÇó

i³öÀ´£¬¼ÇΪri?a2£¨i=0,1¡­.log2b£©,Ôòa?rb?rb???rb£¬²»³¬¹ý(log2b)´Î³Ë·¨¡£

²ÉÓÃÒÔÉϵķ½·¨¼ÆËã³Ë·½µÄʱ¼ä¸´ÔÓ¶ÈΪO(log2b)¡£

12kb16.1.1 ¡¼°¸Àý1¡½¸ß¼¶Ä£ÔËËã 10388 hnu oj

ÈËÓëÈËÊDz»Í¬µÄ,ÓÐЩÈËϲ»¶ÔĶÁÂúÊÇÅ®º¢×ÓµÄÔÓÖ¾£¬ÓÐЩÈËϲ»¶ÔÚµØÏÂÊÒÒý±¬Õ¨µ¯£¬¶ø»¹ÓÐһЩȴϲ»¶Ò»Ð©Âé·³µÄÊý×ÖÓÎÏ·¡£±ÈÈçESSEÂÛ̳µÄÒ»´Î»î¶¯£º

ÿ¸öÈËÑ¡ÔñÁ½¸öÊý×ÖAiºÍBiдÔÚÖ½ÉÏ£¬ÆäËûÈ˲»ÄÜ¿´¼û¡£¹ýÁËÒ»¶Îʱ¼äºó£¬Ã¿¸öÈË˵³ö×Ô¼ºÖ½ÉϵÄÊý×Ö£¬È»ºóÿ¸öÈ˵ÄÄ¿±êÊÇÇó³öËùÓеÄAiBiµÄºÍÄ£MµÄÖµ£¬×îÏÈËã³ö½á¹û

ACM³ÌÐòÉè¼ÆÅàѵ½Ì³Ì

µÄ£¬¾ÍÊÇʤÀûÕß¡£

×÷Ϊһ¸ö³ÌÐòÔ±£¬Ä㵱ȻÓа취±àÒ»¸ö³ÌÐò£¬ÒÔ×î¿ìµÄËÙ¶ÈËã³ö½á¹û£¬Ó®µÃ±ÈÈü¡£

ÊäÈë°üº¬Z×é²âÊÔÊý¾Ý£¬ÊäÈëµÚÒ»ÐÐÖ»°üº¬Êý×ÖZ¡£ËæºóÊDzâÊÔÊý¾Ý£ºµÚÒ»ÐÐÊÇÒ»¸öÊý×ÖM(1¡ÜM¡Ü45000)¡£µÚ¶þÐÐÊÇÊý×ÖH£¨1¡ÜH¡Ü45000£©±íʾ²Î¼ÓÓÎÏ·µÄÈËÊý¡£½ÓÏÂÀ´HÐУ¬Ã¿ÐÐÁ½¸öÊýAiºÍBi£¨1¡ÜAi£¬Bi¡Ü231£©¡£±í´ïʽµÄÖµ£º

(A1B1+A2B2+...+AHBH)mod M.

3

16 4 2 3 3 4 4 5 5 6 36123 1

2374859 3029382 17 1 318132

¶ÔÓÚÿ×é²âÊÔÊý¾Ý£¬Êä³öÒÔÏÂ

ÑùÀýÊä³ö2

13195 13

È¡Ä£ÔËËã¿ÉÒÔÓë¼Ó¡¢¼õ¡¢³Ë¡¢³Ë·½½»»»´ÎÐò£»

(a+b)%m=a%m+b%m a*b%m=(a%m)*(b%m) ab%m=(a%m)b

ËùÒÔ±í´ïʽµÄÈκÎÖмä½á¹û¶¼¿ÉÒÔ½øÐÐÈ¡Ä£ÔËË㣬ʹµÃÖмä½á¹û²»ÖÁÓÚÌ«´ó¶øÒç³ö¡£

±¾ÌâµÄ¹Ø¼üÔÚÓÚ¼ÆËãÐÎÈçab%mµÄ±í´ïʽµÄÖµ£¬ÒòΪbµÄÖµ½Ï´ó£¬²ÉÓÃÁ¬³ËµÄ·½·¨ÊDz»Ðеģ¬²ÉÓñ¾½Ú½éÉܵÄÖ»ÐèÒªO(log2b)´Î³Ë·¨ºÍÄ£ÔËËãµÄ·½·¨¡£

232¡¤ ¡¤

µÚ16ÕÂ ÊýÂÛÎÊÌâ

voidcal(unsigned*r,longunsigneda,unsignedm){ //¼ÆËãaµÄ2j´Î·½¶ÔmÈ¡Ä£µÄ½á¹û,ÓÃÊý×ér±£´æ r[0]=a%m;

for(i=1;i<32;++i)

r[i]=(long)r[i-1]*r[i-1]%m;//ri+1=ri*ri

}

unsignedcalc(unsignedm,longunsigneda,longunsignedb){ //º¯Êý¼ÆËãab%mµÄÖµ

intbl[32],r[32];//blÊÇbµÄ¶þ½øÖƽá¹û£¬r[i]=aµÄ2j´Î·½¶ÔmÈ¡Ä£µÄ½á¹û cal(r,a,m);//¼ÆËãr[i]

while(b){//½«bÓöþ½øÖÆÐÎʽ±íʾ,½á¹û±£´æÔÚblÖÐ

bl[i++]=b%2; b>>=1;}

for(j=0,k=1;j

if(bl[j])//Èç¹û

b¶ÔÓ¦¶þ½øÖÆλbjΪ1,Ôò¶ÔÓ¦µÄrbjÔÚÃݵij˻ý±í´ïʽÖУ¬·ñÔò²»ÔÚ

k=k*r[j]%m;

returnk;}

intmain(){ scanf(\while(z--){

scanf(\ for(j=s=0;j

scanf(\ s=(s+calc(m,a,b))%m;}//¼ÆËã

AjBjµÄÖµ£¬²¢½«ÆäºÍÇó³öÀ´£¬½á¹ûÓñäÁ¿s±£´æ

printf(\

16.2 Å·À­¶¨ÀíµÄÓ¦ÓÃ

¶¨Àí(Fermat)1£ºÈç¹ûpÊÇËØÊý£¬Ôò¶ÔÈÎÒâµÄa£¬ÓÐap?1modp?1¡£

¶¨Àí(Euler)2£ºÈç¹ûp²»ÊÇËØÊý£¬Ôò¶ÔÈÎÒâµÄ(a,p)=1£¬ÓÐa?(p)modp?1£¬ÆäÖеÄ

?1??1??1???????(p)?p?1?1??1???????£¬p1,p2,¡­,pkÊÇpµÄËùÓÐËØÊýÒò×Ó¡£ ppp1??2?k???16.2.1 ¡¼°¸Àý2¡½¿ìÀÖ2004

¿¼Âǵ½Ò»¸öÕýÕûÊýX£¬SÊÇËùÓÐ2004XµÄÒò×ӵĺͣ¬ÄãµÄÄ¿±êÊÇÇó³öS³ýÒÔ29µÄÓàÊý¡£

¿´¿´X=1µÄÀý×Ó£¬20041µÄËùÓÐÒò×ÓΪ1,2,3,4,6,12,167,334,501,668,1002ºÍ2004£¬Òò

¡¤233¡¤

ACM³ÌÐòÉè¼ÆÅàѵ½Ì³Ì

´ËS=4704£¬¶ø4704 mod 29 =6¡£

ÊäÈëÓжà¸ö²âÊÔÐòÁУ¬Ã¿¸ö²âÊÔÐòÁÐÒ»ÐÐÒ»¸öÕýÕûÊýX£¬(1<=X<=10000000)¡£ X=0±íʾÊäÈë½áÊø£¬²¢ÇÒ²»ÐèÒª´¦Àí¡£

¶Ôÿ¸ö²âÊÔÐòÁУ¬Êä³öÒ»ÐоÍÊÇS³ýÒÔ29µÄÓàÊý¡£

10000 0

10

ÌâÄ¿ÒªÇóµÄÊÇ£¨2004X£©µÄÒò×ӺͶÔ29È¡Ä£µÄ½á¹û Çóij¸öÊýAµÄËùÓÐÒò×Ӻͣ¬Ê×ÏȽ«¸ÃÊý·Ö½â£º

A?p11?p22??pnn£¬ÆäÖÐp1,p2,...,pn¶¼ÊÇËØÊý£¬ÔòAµÄÈÎÒâÒò×Ó¿ÉÒÔ±íʾΪ£º

d?p11?p22??pnn£¬ÆäÖÐ0?i1?r1,....0?in?rn

pnn?1p11?1p22?1???? ½«ÆäÇóºÍ£¬ÎªS?p1?1p2?1pn?1r?1r?1r?1rrriiiÈ磺2004=22*3*167£¬Ôò

23?132?11672?1S????7?4?168?4704

2?13?1167?1¶ø2004X?22X?3X?167X

22X?1?13X?1?1167X?1?1r???ËùÒÔS?£¬ÆäÖÐr?(22X?1?1)(3X?1?1)(167X?1?1) 2?13?1167?1332X»¹ºÜ´ó(1?X?10000000)£¬¸ù¾ÝFermat¶¨Àí,ÈÎÒâËØÊýp,ÈÎÒâÊýa,ÓÐap?1modp?1£¬Ôòa28mod29?1£¬ËùÒÔabmod29?abmod28mod29

ËùÒÔÊ×ÏȽ«X¶Ô28È¡Ä££¬x=X(ÊÇÈ¡Ä£µÄ½á¹û£¬x¾ÍºÜСÁË(0?x<28£¬ÓÐÁËÕâµã£¬ÊäÈëµÄXÔÙ´óҲû¹Øϵ)£¬¼òµ¥¼ÆËã¾Í¿ÉÒԵõ½rµÄÖµ¡£

×îºó£¬¿¼Âǵ½£ºS?rmod29£¬Ò²¼´r?29k?332S£¬kÊÇÂú×ãµÈʽµÄÈÎÒâÕûÊý¡£

332¶ø9?332?103?29?1£¬9?(r?29k)?9?332S?S?103?29S ËùÒÔr?9mod29?Smod29

ÀýÈçµ±X=10000ʱ£¬¼ÆËã200410000=220000*310000*16710000µÄËùÓÐÒò×ӺͶÔ29È¡Ä£µÄ½á¹û

220001?1310001?116710001?1rÆäS? ???2?13?1167?1332 234¡¤ ¡¤