2019杭电多校第九场补题(1001, 1003, 1007, 1008)

1001: Rikka with Quicksort

推导方法是从这篇博客学习的。
原来的式子可以写成:

g m ( n ) = n − 1 + 2 n Σ j = 0 n − 1 g ( j ) ( n > m ) g_m(n)=n-1+\frac{2}{n}\Sigma_{j=0}^{n-1}g(j){(n > m)} gm(n)=n1+n2Σj=0n1g(j)(n>m)

这个式子有一个求和,考虑怎么把求和消掉,想到降阶之后相减可以消去这个求和。
降阶有:

g m ( n − 1 ) = n − 2 + 2 n − 1 Σ j = 0 n − 2 g ( j ) ( n > m + 1 ) g_m(n-1)=n-2+\frac{2}{n-1}\Sigma_{j=0}^{n-2}g(j){(n > m+1)} gm(n1)=n2+n12Σj=0n2g(j)(n>m+1)

第一个式子两边乘n,第二个式子两边乘n-1
两式相减得:

n ∗ g m ( n ) = 2 ( n − 1 ) + ( n + 1 ) g m ( n − 1 ) n*g_m(n)=2(n-1)+(n+1)g_m(n-1) ngm(n)=2(n1)+(n+1)gm(n1)

发现 g m ( n ) g_m(n) gm(n)的系数比 g m ( n − 1 ) g_m(n-1) gm(n1)的系数要大1。两边同除n*(n+1)得

g m ( n ) n + 1 = 2 ( n − 1 ) n ( n + 1 ) + g m ( n − 1 ) n ( n > m + 1 ) \frac{g_m(n)}{n+1}=\frac{2(n-1)}{n(n+1)}+\frac{g_m(n-1)}{n}(n>m+1) n+1gm(n)=n(n+1)2(n1)+ngm(n1)(n>m+1)

a n = g m ( n ) n + 1 a_n=\frac{g_m(n)}{n+1} an=n+1gm(n)得: a n = a n − 1 + 2 ( n − 1 ) n ( n + 1 ) a_n=a_{n-1}+\frac{2(n-1)}{n(n+1)} an=an1+n(n+1)2(n1)(n>m+1)

第一位可以使用的a是 a m + 1 a_{m+1} am+1,所以有

a n = a m + 1 + Σ i = m + 2 n 2 i − 2 i ( i + 1 ) a_n=a_{m+1}+\Sigma_{i=m+2}^n\frac{2i-2}{i(i+1)} an=am+1+Σi=m+2ni(i+1)2i2

右边的求和怎么处理呢?观察这个式子: 2 i − 2 i ( i + 1 ) \frac{2i-2}{i(i+1)} i(i+1)2i2
我们知道 1 i + 1 i + 1 = 2 i + 1 i ( i + 1 ) , 1 i ( i + 1 ) = 1 i − 1 i + 1 \frac{1}{i}+\frac{1}{i+1}=\frac{2i+1}{i(i+1)},\frac{1}{i(i+1)}=\frac{1}{i}-\frac{1}{i+1} i1+i+11=i(i+1)2i+1,i(i+1)1=i1i+11,那么有:

2 i − 2 i ( i + 1 ) = 1 i + 1 i + 1 − 3 i ( i + 1 ) = 4 i + 1 − 2 i = 2 i + 1 + ( 2 i + 1 − 2 i ) \frac{2i-2}{i(i+1)}=\frac{1}{i}+\frac{1}{i+1}-\frac{3}{i(i+1)}=\frac{4}{i+1}-\frac{2}{i}=\frac{2}{i+1}+(\frac{2}{i+1}-\frac{2}{i}) i(i+1)2i2=i1+i+11i(i+1)3=i+14i2=i+12+(i+12i2)

所以:

Σ i = m + 2 n 2 i − 2 i ( i + 1 ) = ( Σ i = m + 2 n ( 2 i + 1 ) ) + 2 n + 1 − 2 m + 2 \Sigma_{i=m+2}^n\frac{2i-2}{i(i+1)}=(\Sigma_{i=m+2}^n(\frac{2}{i+1}))+\frac{2}{n+1}-\frac{2}{m+2} Σi=m+2ni(i+1)2i2=(Σi=m+2n(i+12))+n+12m+22

到这里为止,只剩下一个调和级数求和比较麻烦了。我们可以在本地打一个表,每隔5e5个数求一个值,这样每次求调和级数最多只要暴力的跑5e5的规模就可以得到答案。

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 5e5;
ll p[]={0, 389417116, 881884276, 553560598, 224432428, 260751735, 117569315, 346569238, 65973860, 256727000, 517470973, 876872576, 558995133, 401034235, 860051261, 536279467, 155788942, 955368968, 910520518, 551669479, 120304438, 868572373, 154582539, 657446462, 519742130, 937315262, 627424624, 261857562, 845041807, 947164171, 554328605, 482373981, 656331368, 36059187, 691227914, 538023106, 840211063, 712172696, 388741362, 105309083, 529978561, 185368676, 897343109, 895444019, 93875054, 796757979, 197837413, 258616124, 294171160, 256252543, 218059710, 432483635, 992370950, 998412848, 608415075, 497589222, 127363831, 933703444, 605748785, 892473929, 874956379, 500087023, 695700236, 175774637, 302540311, 535825517, 434730736, 888251098, 585400383, 158924035, 704261248, 773664140, 297528324, 564952040, 326818180, 907093492, 492252413, 942671867, 463421375, 157069629, 387370501, 739182811, 872587234, 493403290, 361055436, 982695338, 992982497, 506967624, 325135313, 139432162, 801394116, 453282175, 557360951, 863788156, 403960409, 87987742, 547993698, 668279581, 775785847, 202341215, 299703623, 985901935, 472678625, 625901892, 403957663, 400898273, 380758761, 808106200, 540946595, 399100493, 374446961, 543807609, 228705807, 650166923, 892207521, 657180487, 718954981, 347048384, 57611608, 888748566, 776424610, 865895081, 71562850, 388913307, 896393406, 149844661, 90704811, 847090444, 271738138, 599648680, 153293323, 25276529, 339320628, 444749727, 153347307, 913959099, 896068049, 46732292, 632403841, 111671658, 117739701, 431209934, 466237359, 92531571, 504300280, 230286215, 315016389, 593369627, 391019917, 170185585, 945735692, 933492428, 935020357, 435114737, 882658738, 268811339, 739835603, 949251083, 933165221, 542499646, 989769439, 523226750, 782121533, 92948180, 249519096, 571311841, 193556131, 518177930, 703222437, 990319348, 419413446, 441470909, 431786435, 679913200, 631744438, 555918800, 949953078, 482508989, 999174487, 216453269, 347817442, 481802904, 181159585, 170484593, 782823623, 170348466, 724333362, 894176406, 992209009, 668353268, 421432125, 388368704, 717981978, 479900086, 963213881, 717830438, 949213181, 313261786, 905975821, 375088827, 397787437, 888156970, 979828694, 625110244, 480573495, 27116448, 277991208, 327190878, 549719751, 911236059, 567216451, 926379681, 47229125, 367041435, 193523226, 945980477, 562775516, 777761880, 198426247, 274321633, 701258838, 117844353, 658499361, 348615673, 951483459, 774167087, 798815837, 564219784, 289824405, 376946374, 212292772, 10903613, 298288616, 164895248, 228285400, 456895326, 82003167, 835113182, 14644418, 219675409, 667403141, 867649986, 637219612, 513019047, 776881735, 906719336, 746273961, 324433545, 470673094, 930426229, 63221052, 336356381, 396553805, 241846252, 802421416, 856290602, 664109705, 835723147, 330618733, 844530433, 80898868, 981109485, 500911712, 19012239, 372936810, 330748900, 14763369, 723787870, 164434278, 82327247, 800155067, 605234103, 129543226, 637773976, 522371293, 954838687, 885734730, 310622951, 864146098, 319564474, 190734195, 246200234, 760467956, 22662236, 53928139, 429662225, 773945403, 969760528, 355892699, 978407063, 893464662, 908021390, 613233574, 546378870, 649265872, 659568871, 750616222, 878639633, 542952833, 774648402, 174676223, 843228321, 49232709, 463526087, 491571581, 541144119, 636833544, 905462845, 18734469, 12962695, 128738923, 25064732, 344556596, 456113835, 869386371, 30891062, 926461092, 835590703, 866124411, 998294297, 189177380, 94421296, 528948452, 101236982, 137544262, 228585373, 899481695, 425340656, 604975812, 212863662, 982588373, 478630853, 880849435, 149414031, 858716632, 861806063, 680329826, 886786107, 787961996, 97375858, 331778750, 488255625, 91643473, 482696817, 471903941, 720231022, 35501904, 327391134, 297918764, 996892378, 875624473, 892970348, 698628706, 944223790, 177359323, 834468505, 96043834, 158651660, 799943555, 268307906, 132305296, 91501436, 274017167, 307171415, 430246600, 142950244, 803909020, 778054401, 885071333, 583898600, 211359087, 379263459, 908310181, 943017790, 163092501, 472894133, 289723843, 714964176, 862932058, 351490071, 335517815, 523579059, 160745095, 186863098, 353121184, 347680289, 396002777, 197519171, 254876617, 971331885, 299997699, 80705369, 148894905, 832751326, 282450851, 466349450, 892767244, 953811475, 141750010, 93805088, 197002259, 410698779, 189488125, 644717767, 336988739, 768779494, 5912479, 427111430, 377980801, 990750605, 779389514, 920318081, 730269025, 405160401, 863910892, 552002374, 80416580, 637404093, 990383116, 781085171, 346918584, 946658334, 911285900, 944989801, 970687314, 725156568, 196919273, 483078487, 814269369, 335140176, 981721633, 859157852, 537167041, 814845045, 524124890, 392641637, 512141421, 416081775, 129452529, 114656981, 826629961, 460416574, 844552662, 220993924, 858326199, 488746340, 316201725, 29560122, 216345457, 20169011, 217177043, 525595364, 170644387, 408960976, 330742436, 106978295, 110465947, 491908049, 479850415, 681471473, 454012664, 429628683, 334245732, 58122033, 482115882, 826487385, 61454438, 30503514, 582477184, 260591674, 856049964, 833912601, 2773859, 275349383, 622296549, 774855580, 54916186, 738787531, 135709872, 823183945, 344915784, 82126223, 568517529, 214903564, 323549891, 846479893, 255018380, 982212201, 244220213, 433985385, 769833837, 141937532, 525761676, 446953275, 966219748, 558261150, 267020701, 84127338, 139057568, 841776071, 863807780, 808773244, 28693094, 907368327, 330606295, 496950786, 8320903, 841131660, 214044553, 538257363, 393795758, 563997919, 665964664, 546234540, 882496045, 580279702, 8450322, 75522646, 993754156, 7482487, 955916665, 621978994, 247561367, 865567889, 308068598, 502463398, 842596232, 788299382, 397110730, 775124006, 314934564, 430290123, 680815816, 283439928, 628852384, 833125405, 952681019, 948331009, 535841432, 182780572, 216765678, 791618620, 780975103, 925883170, 376023889, 815542063, 261389176, 716672861, 801658162, 735391520, 265596593, 187869397, 91699598, 234246839, 764918198, 733195817, 511700832, 573234981, 106145258, 975736871, 911267454, 587548872, 739393971, 815147992, 814157941, 620386257, 671802787, 642304588, 325919370, 218133634, 233034201, 566433982, 715878648, 942034601, 625378598, 455466484, 730009499, 710958934, 378907903, 275853589, 198286265, 740737703, 462512669, 433331577, 947151033, 425391636, 523579938, 141789258, 536898412, 569797996, 262628273, 950911285, 142820273, 232803301, 539768489, 914068666, 602447994, 491263027, 235455284, 497761222, 538198972, 137133919, 214191280, 756396877, 445514935, 449849907, 493630627, 47228536, 531830910, 574068337, 905192318, 281025524, 896019991, 290667965, 740494128, 247838305, 942747711, 325078518, 669511348, 839080985, 641305799, 335468312, 80632706, 408283378, 456548728, 843159541, 267448502, 148733752, 552369315, 540881335, 8751051, 798998664, 206840691, 19843339, 17660702, 276223065, 359904237, 979477783, 558390866, 970805053, 110359136, 347506445, 182907463, 285252788, 351902724, 371656184, 706703575, 345418939, 509166404, 802570600, 805761316, 35372485, 868781538, 688336364, 215982087, 538141842, 20607414, 668262500, 561336803, 583247314, 665695075, 192520101, 332434198, 593806051, 244445636, 262913578, 296096139, 321547746, 146919848, 834151240, 842092888, 177765506, 918082161, 435069343, 917457352, 81755632, 830767799, 813510499, 267667178, 835990691, 480488375, 442362382, 429939239, 394651441, 980195946, 345126377, 652990300, 50831988, 168766941, 809108242, 213746668, 761807501, 860340545, 909220984, 70455831, 261056407, 471021753, 322774840, 924987880, 45363760, 953037667, 782046475, 613453099, 475441097, 3429459, 364684019, 716134815, 699270327, 939302878, 748009062, 666207894, 398114342, 611865600, 911278750, 265886799, 53153621, 641182721, 434476296, 98208049, 609829767, 388621721, 396545430, 393532945, 522703807, 574587123, 389156988, 127861156, 230562840, 994167927, 570751444, 838670046, 107879308, 695283917, 40848296, 79683927, 533329854, 295133756, 712656109, 485611497, 942243089, 635797092, 844123564, 794413528, 510513735, 773300455, 917922873, 96883968, 379298765, 490174758, 685976324, 448813356, 235982652, 464292047, 183541525, 300836489, 177647256, 809512110, 323574386, 845031071, 213752224, 582250339, 56384333, 45343241, 152392669, 600429650, 6734486, 752724813, 733212331, 907896194, 970754612, 128127479, 761517551, 743059668, 552885355, 670965886, 98794340, 472836596, 130554967, 353477407, 325178472, 221922189, 788809915, 823162423, 838350318, 325363437, 72618122, 103238070, 777328655, 895577196, 889659170, 377600299, 369958415, 724360516, 575792279, 317927778, 712574234, 696348496, 477561593, 480835757, 826319954, 822088932, 292518000, 173129883, 714847164, 100903109, 146562848, 509872002, 694354378, 30509651, 368423096, 793096382, 416995537, 912265097, 78047390, 635124790, 515614527, 329022335, 164655379, 792929990, 883437548, 593861074, 191546643, 724921103, 570563608, 364763007, 889578173, 323091544, 970593659, 105177566, 334105917, 446841838, 519192814, 69674243, 70546640, 301701567, 221138328, 775945591, 50866163, 118967946, 586137233, 357062752, 869826821, 879371631, 570826740, 881226630, 111952250, 637838809, 81260372, 956684052, 262099384, 243147555, 254165158, 625392356, 851304014, 75278025, 341300141, 889180150, 604214413, 838429372, 468732558, 229023163, 262000883, 163264861, 579612995, 829182493, 441402731, 889667661, 459999762, 102035773, 547225521, 411031724, 300848330, 273947779, 695529921, 21430378, 674275612, 208075884, 517541212, 680853499, 713369894, 49495696, 156421228, 27721949, 79515474, 840654300, 341515196, 411256694, 977431599, 891010280, 570452602, 970033134, 912488358, 34676307, 605156838, 825939, 56162774, 317514406, 553271166, 968573110, 147422075, 872439661, 708853592, 391075505, 232841459, 795407218, 391327141, 652489241, 634448624, 875070467, 694991690, 679206205, 535111282, 228223288, 219147590, 272752045, 208649582, 283364033, 849812195, 698940617, 688584882, 641498780, 767860645, 455485924, 420896037, 331410012, 213780045, 614815198, 884616760, 903969475, 119476258, 948700634, 188432777, 173366382, 253432377, 981988015, 839747958, 9972884, 710404455, 265040543, 632766417, 584278645, 996580019, 898235586, 20804500, 473365059, 111506955, 625076457, 16967458, 156934123, 465670591, 540091039, 20269436, 167257252, 720882896, 257419317, 354651261, 237528245, 622195384, 566697660, 23176274, 225807662, 589188960, 156540145, 628083401, 593965224, 972173742, 527434258, 45419594, 338543393, 157076345, 259063313, 851981978, 444248903, 49033251, 516869051, 719101844, 313817985, 604873745, 305869681, 528104924, 493528919, 691270138, 734963854, 501247650, 197766490, 70087719, 798226158, 535552827, 896336218, 735066836, 354472923, 832378318, 371412817, 469133061, 489817232, 451650053, 616040351, 625830647, 596732314, 38979565, 486982966, 991574969, 402379357, 255879717, 314004690, 541696576, 537330486, 708776422, 30977444, 741312802, 947304195, 381995397, 124325062, 725518836, 976014973, 257533181, 450850674, 906948760, 901262181, 49293649, 955255717, 943549130, 440111488, 711671089, 53222380, 410346707, 450538058, 479857861, 363670182, 514669437, 493526521, 165325493, 725077347, 97888782, 399102326, 311945460, 630022204, 687119304, 276349041, 29196624, 533417615, 606383129, 572250039, 271050735, 922645861, 664547924, 348873742, 961864369, 866756797, 695170893, 651127832, 249306264, 726333652, 999957224, 319491323, 646279525, 421305744, 421002278, 505167105, 867311258, 107977989, 637052146, 457483343, 100213508, 212077938, 489319526, 967327512, 698586733, 33490544, 759783390, 745899187, 143578174, 964625899, 107716047, 685294202, 884902791, 408869465, 675385514, 782873514, 153041933, 512264754, 777859724, 753534275, 695819542, 890050157, 521743891, 466432933, 347618735, 670353054, 17603825, 440383757, 941919947, 502057106, 551140497, 258292363, 648670900, 868869323, 651559648, 188008608, 876494743, 726741755, 863555310, 48808113, 728736601, 540603499, 232531229, 739327008, 116406559, 192533803, 951173788, 457969670, 95507961, 441344936, 440425658, 165742244, 444133736, 180260478, 122097442, 566022731, 433827005, 351764771, 301042466, 977290752, 314607388, 421266407, 996181647, 559104821, 110142891, 599861657, 430664847, 750170433, 631136753, 247611860, 263908324, 871398198, 372449225, 259195465, 446784731, 996025972, 823007439, 831435669, 914692855, 584275727, 510157358, 742548687, 140754271, 845495362, 386257305, 257654985, 377770688, 224329231, 648424224, 300658145, 817646545, 992710638, 914820375, 924189496, 932956678, 877491804, 846497903, 618429094, 656239365, 518718248, 34711594, 766836529, 869436923, 181140271, 195502288, 164306906, 223049721, 932182776, 695632170, 6121988, 551161050, 591810437, 131353407, 719557720, 235158219, 911253527, 31968369, 805303356, 716312750, 738655543, 204814673, 685492181, 933150979, 82460898, 705317584, 784368931, 210267603, 162571769, 902780323, 911673042, 702176718, 438361881, 584122721, 6420342, 162842303, 114024001, 858848369, 753275805, 914901517, 880133902, 834986532, 83592767, 778120230, 293534685, 353643635, 671472330, 292046340, 494237566, 193201468, 690558980, 65631547, 134465071, 587441657, 738646042, 525246917, 749876495, 604339783, 833852913, 570717357, 242199917, 215830292, 174401287, 453220513, 857380225, 858257690, 29074626, 741007415, 716972112, 878965771, 918370289, 724745841, 83430985, 23195600, 889243891, 518948724, 699046680, 507900974, 636316098, 727997349, 446175190, 178641360, 790878300, 30041257, 548150047, 943552991, 304957524, 233722078, 456286197, 809975497, 274092515, 310624626, 566099045, 534647680, 913137157, 455789264, 771321639, 214906527, 436076267, 955605881, 962257384, 396605041, 42178612, 933846753, 988077852, 158473053, 596232835, 8422378, 298408887, 915164042, 560446696, 361589303, 3912078, 522028220, 656192864, 975877183, 826721597, 438718031, 627399847, 762874455, 576975132, 63437901, 656592501, 758660789, 785536396, 579742444, 138539751, 145273995, 427295347, 658914229, 165638733, 412748580, 902893714, 452422427, 595128242, 183420673, 904728539, 586546460, 160788667, 590117309, 817154218, 735442196, 979079552, 329617038, 323295238, 698182005, 936483886, 105071352, 539909358, 611822739, 273836774, 584683161, 71225520, 143036808, 723246366, 896915971, 775865813, 757517288, 451764301, 455873557, 400794681, 88203009, 925756070, 355320244, 766331866, 856546844, 90720390, 309008031, 721793982, 163330479, 208089255, 284289699, 729347670, 757098890, 194035908, 680858623, 206850102, 548358526, 798607097, 496773709, 643655693, 200035282, 748442012, 877679940, 393014716, 302392150, 673681579, 981809957, 814199119, 179859817, 393662717, 113114273, 742796284, 847890210, 464585146, 273659347, 137521346, 616378841, 324835914, 843483672, 246407282, 146581482, 590352640, 938302779, 702247251, 436708363, 279262443, 603190674, 83647804, 472472726, 363769511, 152803930, 946611338, 754928908, 824426917, 184999414, 838569581, 557564494, 383495983, 430898953, 746340889, 725476438, 226957248, 811540867, 927388262, 682901457, 785444453, 791820542, 658864507, 456435086, 803920002, 780639497, 415735258, 920284017, 815789669, 990212324, 921909856, 158939364, 812133339, 453178086, 576655831, 703143840, 660536671, 591541828, 635831015, 864028341, 501334000, 292843278, 658815022, 995894538, 975331884, 116318764, 309816261, 143108904, 731626913, 108755464, 369296187, 100548986, 961188455, 700393517, 53713173, 611003927, 621878087, 204605393, 432284479, 340625516, 955949273, 472526054, 42021113, 622764190, 259734068, 318776556, 824646990, 137324139, 281522273, 439923989, 462404170, 251152863, 902214464, 992229008, 798284513, 303360657, 723028008, 214147822, 900842497, 522269756, 324378424, 506190799, 31243697, 123257389, 410523198, 181870595, 616966886, 13232168, 718110650, 148222998, 228773372, 806988723, 911980928, 331093219, 228660174, 4467371, 933496938, 39661840, 561473393, 183682919, 147112856, 453475322, 371964715, 981006044, 160335324, 141759218, 932011166, 841889811, 925054467, 939838157, 14948071, 225502052, 489255251, 120235385, 741546464, 707056071, 47667348, 911937328, 950135025, 910876492, 471242403, 393263530, 478020176, 677396620, 603963882, 229235433, 693694411, 164893143, 102330997, 348930241, 778460218, 191038882, 602068215, 118497615, 292503186, 799506446, 793426520, 319659351, 454805497, 257953774, 379122601, 157844454, 258055056, 411486499, 369867007, 575347047, 699008212, 942847245, 944251486, 893554817, 60398046, 570083005, 787242034, 12490793, 799527110, 290981484, 337398837, 956721687, 705918891, 592272749, 783630643, 679147777, 137602889, 925221793, 361516628, 345359848, 89545275, 205091068, 202557990, 84260159, 373566327, 538381261, 225298631, 812434888, 554742575, 686815125, 366543172, 455613631, 710718080, 34682776, 868963785, 974917736, 610251883, 968789153, 502926489, 280672990, 644091186, 57424102, 163493553, 35189487, 813415264, 380987962, 994924108, 618092756, 434774307, 452886215, 318433738, 628065168, 242574397, 202391056, 702991705, 693971606, 57526831, 546531597, 586672671, 633153341, 440416879, 916735363, 87596049, 178406410, 572671848, 211296225, 729512740, 918901933, 771374890, 999080482, 542698661, 254073511, 302683255, 406303100, 606049149, 415782250, 569537387, 314027973, 182146137, 868497410, 868529356, 786511953, 789129142, 679428192, 243079097, 479027780, 731329651, 620551045, 563329076, 916785714, 808571737, 395459733, 653366773, 386199647, 395406418, 373449044, 833598471, 335921981, 29318056, 326536876, 317139270, 981301286, 409025531, 700738585, 562631959, 190730019, 627560387, 266280692, 531514690, 375289525, 103524186, 722203202, 143258325, 137152895, 207509362, 131733346, 191628679, 772066635, 137929026, 862426374, 861259567, 4521619, 57924370, 630515180, 188797797, 492263768, 336997649, 505350586, 476012756, 471297637, 152663007, 681657137, 741338990, 688052265, 262294828, 246047274, 420458654, 185213150, 866909380, 559009391, 979671928, 559004510, 710467521, 380936186, 58011431, 731511240, 705705059, 464171394, 873168245, 514739941, 968561226, 677924054, 525481154, 267937090, 921013575, 56269077, 314593293, 585048709, 185794685, 327921878, 461664578, 211149558, 277226950, 820809370, 222473208, 149716265, 344310275, 642597773, 164741562, 541976947, 205122217, 578230562, 914862108, 138342548, 969034915, 108801333, 191542875, 837524283, 302316228, 349752663, 465063693, 484534109, 399140014, 30036658, 464419894, 706424275, 688420298, 289241734, 528631763, 999228618, 112402264, 183326067, 490921942, 556677581, 151491026, 411556388, 200484827, 402099470, 111571174, 611447694, 250475091, 8007887, 722810866, 348653588, 935509511, 680248379, 668624876, 206978298, 939723686, 750511958, 144520355, 453524897, 504580877, 162014354, 93769428, 758525986, 806874801, 650080483, 794170657, 367960257, 679630385, 314701963, 74738395, 354443972, 762160779, 175599241, 65866925, 680425617, 777576606, 897621603, 22111448, 160822323, 415308584, 723912010, 135029452, 832847150, 799083566, 814808781, 953631184, 858152935, 972533318, 692089121, 658976380, 782989268, 49939295, 787302792, 892850702, 304108470, 109774344, 714566023, 373162740, 588664579, 116476013, 303353284, 274593180, 784918493, 711768279, 945010033, 303926936, 973828039, 914630948, 850355275, 212925783, 859163703, 529848655, 929095859, 192901914, 170339590, 985052818, 124728340, 578155565, 455979481, 605777218, 65237269, 699637142, 94088445, 228885201, 672399383, 828823391, 754928771, 57521826, 431540442, 387205131, 527908225, 410487464, 562593076, 574352165, 414351608, 682685261, 37543583, 615748262, 761993353, 379733355, 917311825, 291377225, 357787091, 47444855, 89867907, 535136576, 787229851, 370476359, 125265137, 209382736, 29783439, 892709245, 913473120, 915667077, 314640831, 307405918, 658084698, 533807867, 916519165, 487154669, 397026001, 694159220, 778701877, 997868324, 659413629, 624218138, 157577865, 363386280, 328875402, 404338312, 870467638, 218959588, 136111460, 618522582, 208602533, 612900277, 357469376, 985368038, 14248252, 123144193, 297390096, 545433933, 256283197, 569624187, 814113387, 48299749, 43813594, 142786049, 463277580, 777421606, 867710618, 839188154, 384365181, 963975440, 891517022, 183825221, 821995493, 805714418, 370525045, 367873472, 147044444, 924257051, 275306245, 449294689, 507074986, 806657966, 824749191, 638182780, 346674265, 55800762, 746967799, 962983911, 827849602, 183930350, 387070203, 949783426, 814589900, 880068416, 842957571, 564374056, 801841125, 224984765, 773733355, 265676925, 332703346, 275956497, 519092991, 396679834, 934345340, 368641496, 450579596, 754190920, 109368641, 252080293, 363445830, 210397673, 136323514, 209873051, 5302170, 951400423, 945322884, 669724648, 288681170, 479962412, 569024020, 410045432, 282727176, 477146710, 244906158, 593244473, 102366699, 178494482, 461397151, 130920516, 132547326, 668511900, 258743775, 256615293, 744129593, 229349869, 158233613, 271882058, 577971127, 659238085, 613600554, 577408535, 620096753, 563035954, 942058954, 247225826, 394624963, 640851700, 213336642, 807040045, 751464724, 573836850, 602786455, 751242666, 767092390, 40189818, 905939563, 846681441, 647968282, 152406455, 335457034, 707949528, 700155510, 322288153, 582256201, 241406619, 147472017, 671719842, 326430492, 271537091, 118318562, 130872560, 214792275, 175988967, 42761158, 538229443, 490813396, 631514013, 395122909, 138810550, 984426225, 263473971, 98117698, 761853121, 113190704, 544104102, 409038272, 241138305, 149819271, 737424861, 50235825, 458829333, 518723111, 649395755, 3438202, 288171817, 912457808, 662356488, 628843304, 762767804, 751488641, 844443702, 399809383, 567843845, 998342867, 524979882, 236091556, 827600166, 378655393, 650000007};
ll qm(ll a, ll b){
    ll res = 1;
    while(b){
        if(b&1) res = res*a%mod;
        a = a*a%mod;
        b >>= 1;
    } return res;
}
int n, m;
ll H(int t){
    ll sum = p[t/maxn];
    for(int i = t/maxn*maxn+1; i <= t; ++i){
        sum = (sum + qm((ll)i, mod-2))%mod;
    }
    return sum;
}
int main()
{
    int T;
	cin>>T;
	while(T--){
        scanf("%d%d", &n, &m);
        if(n<=m){printf("0\n"); continue;}
        ll ans = (ll)m*qm(m+2, mod-2)%mod + 2*(H(n+1) - H(m+2))%mod + 2*(qm(n+1, mod-2) - qm(m+2, mod-2))%mod;
        ans = ans*(n+1)%mod;
        ans%= mod;
        cout<<(ans + mod) %mod<<endl;
	}
}

1003:Rikka with Mista

n的大小为40,那么折半搜索,得到前一半数字可以凑出的所有数字存在a中,和后一半数字可以凑出的所有数字存在b中。对每一位考虑有几个4。
设当前考虑到第pos位,那么对于a中第pos位是i的数字来说,它和b中的某个数字相加要得到4有两种情况:
1.不进位,相加后第pos位为4.那么b中的那个数字这一位是(14-i)%10
2.进位,相加后第pos位为4.那么b中那个数字这一位是(13-i)%10
从低位到高位算,每次求a中pos位为i的数字有多少种凑出4,在数组有序的情况下,可以用双指针扫一遍,O(n)的求出。因为我们是从低位到高位来,所以可以在转到下一位的时候顺便就排序了(基数排序)。

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int maxn = 1<<21;//教训:个数可能为1<<20的时候,不能开 1e6 + 50
int n;
int bin[10] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
vector<int> a[10], b[10];
int w[44];//
void init()
{
    for(int i = 0; i < 10; ++i) a[i].clear(), b[i].clear();
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%d", &w[i]);
}
ll get0(vector<int> &x, vector<int> &y, int p){//不进位
    ll ans = 0;
    int r = y.size()-1;
    for(int i = 0; i < x.size(); ++i){
        while(r >= 0 && (x[i]+y[r])%bin[p+1] >= 5*bin[p]) r--;
        ans = ans + r + 1;
    }
    return ans;
}
ll get1(vector<int> &x, vector<int> &y, int p){//进位
    ll ans = 0;
    int r = y.size() - 1;
    for(int i = 0; i < x.size(); ++i){
        while(r >= 0 && (x[i]+y[r])%bin[p+1] >= 4*bin[p]) r--;
        ans = ans + (y.size()-1-r);
    }return ans;
}
int tmp[maxn];
int num;
void sol(){
    int m = n/2;
    for(int mask = 0; mask < (1<<m); ++mask){
        int t = 0;
        for(int i = 0; i < m; ++i) if(mask&(1<<i)) t += w[i];
        a[t%10].push_back(t);
    }
    for(int mask = 0; mask < (1<<(n-m)); ++mask){
        int t = 0;
        for(int i = 0; i < (n-m); ++i) if(mask&(1<<i)) t += w[i+m];
        b[t%10].push_back(t);
    }
    ll ans = 0;
    for(int pos = 0; pos < 9; ++pos){
        for(int i = 0; i < 10; ++i){
            int t1 = (14-i)%10, t2 = (13-i)%10;//不进位,进位
            ans += get0(a[i], b[t1], pos);
            ans += get1(a[i], b[t2], pos);
        }
        if(pos == 8) break;
        num = 0;
        for(int u = 0; u < 10; ++u){
            for(int i = 0; i < a[u].size(); ++i) tmp[num++] = a[u][i];
            a[u].clear();
        }
        for(int i = 0; i < num; ++i){
            int u = (tmp[i]%bin[pos+2])/bin[pos+1];
            a[u].push_back(tmp[i]);
        }
        num = 0;
        for(int u = 0; u < 10; ++u){
            for(int i = 0; i < b[u].size(); ++i) tmp[num++] = b[u][i];
            b[u].clear();
        }
        for(int i = 0; i < num; ++i){
            int u = (tmp[i]%bin[pos+2])/bin[pos+1];
            b[u].push_back(tmp[i]);
        }
    }
    cout<<ans<<endl;
}
int main()
{
	int T;cin>>T;
	while(T--){
        init();
        sol();
	}
}

1007:Rikka with Travels

如果一对路径(a,b) (c, d)存在,那一定可以在不缩短其中任何一条路径(可以延长)的情况下使得直径的两个端点都在路径上。
所以有两种情况:
1.直径的两个端点分别属于两条路径
这种情况下枚举第一条路径在直径上最后一个点,对每个枚举的点可以得到第一条路径的最长长度和剩余部分的直径长度。
2.直径本身是一条路径
dfs求一下剩余的每个子树的直径。
如此可以得到对于长度为l1的第一条路径,另一条路径长度最长可以为l2.枚举l1计算贡献。

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int maxn = 1e5 + 50;
vector<int> g[maxn];
int ans[maxn], dep[maxn], fa[maxn], sz[maxn], vis[maxn];
int D[maxn];
int n;
void init()
{
    scanf("%d", &n);
    for(int i = 0; i <= n; ++i) g[i].clear(), ans[i] = 0, sz[i] = 0, vis[i] = 0, D[i] = 0;
    for(int i = 1; i < n; ++i){
        int u, v;scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
}
void dfs(int u, int d, int f){
    dep[u] = d;
    fa[u] = f;
    for(int i = 0; i < g[u].size(); ++i){
        if(g[u][i] == f || vis[g[u][i]]) continue;
        dfs(g[u][i], d+1, u);
    }return;
}
void dfs2(int u, int d, int f){
    dep[u] = d;
    for(int i = 0; i < g[u].size(); ++i){
        if(g[u][i] != f && !vis[g[u][i]])
            dfs2(g[u][i], d+1, u), dep[u] = max(dep[u], dep[g[u][i]]);
    }
    return;
}
void getd(int u, int f){
    dep[u] = D[u] = 1;
    for(int i = 0; i < g[u].size(); ++i){
        int v = g[u][i];
        if(vis[v] || v == f) continue;
        getd(v, u);
        D[u] = max(D[u], dep[u] + dep[v]);
        dep[u] = max(dep[u], dep[v] + 1);
    }
}
vector<int> a;
void sol()
{
    dfs(1, 1, 0);
    int rt = 1;
    for(int i = 1; i <= n; ++i){
        if(dep[rt] < dep[i]) rt = i;
    }
    dfs(rt, 1, 0);
    int t = rt;
    for(int i = 1; i <= n; ++i){
        if(dep[t] < dep[i]) t = i;
    }
    a.clear();
    while(t){//标记直径上的点
        a.push_back(t);
        vis[t] = 1;
        t = fa[t];
    }
    int mx = 0;//删掉直径上的点之后的最长路径长度
    for(int i = 1; i <= n; ++i){
        if(vis[i]) continue;
        if(!D[i]) getd(i, 0);
        mx = max(mx, D[i]);
    }
    ans[mx] = a.size(); ans[a.size()] = mx;//直径为一条路径

    //考虑两个路径各自占一个端点
    for(int i = 0; i < a.size(); ++i) dfs2(a[i], 1, 0);
    int d = a.size();//直径
    sz[d] = 0;
    for(int i = a.size()-1; i >= 0; --i){
        sz[i] = dep[a[i]];
        sz[i] = max(d-i-1+sz[i], sz[i+1]);
    }//sz[i]表示直径在i这个点断开,[i,a.size()-1]这些点和它们的子树可以构成的最长路径

    for(int i = 0; i < a.size()-1; ++i){
        int l1 = i+dep[a[i]], l2 = sz[i+1];//枚举l1在直径上的最后一个点
        ans[l1] = max(ans[l1], l2);
        ans[l2] = max(ans[l2], l1);
    }
    ll res = 0;
    for(int i = a.size(); i >= 1; --i){
        ans[i] = max(ans[i], ans[i+1]);
        res = res + ans[i];
    }
    printf("%lld\n", res);
}
int main()
{
	int T;cin>>T;
	while(T--){
        init();sol();
	}
}

这题据说还可以树上DP来写。思路是枚举每一条边都可以把原来的树分成两个子树,然后计算两颗子树的直径。然后换边的时候转移一下,不过需要记录的东西有点多。对于一个树来说,直径可能是它子树的直径,也可能是通过根的一条路径。所以需要记录前三大的向下的路径,和前俩大的子树直径,然后转移的时候还要知道向父亲方向的最长边,向父亲方向的最长直径……(口嗨一下,没有代码。

1008: Rikka with Stable Marriage

和第五场的1002何其的相似……甚至代码只改了4行就A了。。。
也是两棵字典树,但是这次是每一位优先配出1.

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 50;
struct node{
    int ch[2];
    int cnt;
}e[maxn*60];
int r1, r2, tot;
void Insert(int rt, int x){
    int p = rt;
    for(int i = 29; i >= 0; --i){
        int t = !!(x&(1<<i));
        if(!e[p].ch[t]){
            e[p].ch[t] = ++tot;
            memset(e[tot].ch, 0, sizeof e[tot].ch);//新结点的儿子是空的
            e[tot].cnt = 0;//新结点的数目是空的
        }
        p = e[p].ch[t];//进入子节点
        e[p].cnt++;//子节点的数目+1
    }
    return;
}
int n;
void init(){
    scanf("%d", &n);
    tot = 0;
    r1 = ++tot;
    r2 = ++tot;
    e[r1].cnt = e[r2].cnt = e[r1].ch[0] = e[r1].ch[1] = e[r2].ch[0] = e[r2].ch[1] = 0;
    for(int i = 0; i < n; ++i) {
        int x; scanf("%d", &x); Insert(r1, x);
    }
    for(int i = 0; i < n; ++i){
        int x; scanf("%d", &x); Insert(r2, x);
    }
}
int fnd(int k1, int k2, int pos){
    e[k1].cnt--; e[k2].cnt--;
    if(pos < 0) return 0;
    int lc1 = e[k1].ch[0];
    int rc1 = e[k1].ch[1];
    int lc2 = e[k2].ch[0];
    int rc2 = e[k2].ch[1];
    if(e[lc1].cnt && e[rc2].cnt)//0 1
        return (1<<pos)+fnd(lc1, rc2, pos-1);
    else if(e[rc1].cnt && e[lc2].cnt)//1 0
        return (1<<pos)+fnd(rc1, lc2, pos-1);
    else if(e[lc1].cnt && e[lc2]. cnt)//0 0
        return fnd(lc1, lc2, pos-1);
    else if(e[rc1].cnt && e[rc2].cnt)// 1 1
        return fnd(rc1, rc2, pos-1);

}
int c[maxn];
void sol()
{
    ll ans = 0;
    for(int i = 0; i < n; ++i){
        ans += fnd(r1, r2, 29);
    }
    printf("%lld\n", ans);
}
int main()
{
    int T;cin>>T;
    while(T--){
        init();sol();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值