传送门:【HDU】5197 DZY Loves Orzing
题目分析:
首先申明,我不会 dp 方程= =……这个东西给队友找出来了,然后我就是套这个方程做题的Qrz……
对于这题,因为 n2 个数互不相同,所以每一列都可以单独考虑。设 dpni 表示长度为 n 的排列,能恰好看见 i 个人的方案数,根据队友的发现, dpni 就等于 |sni| ,其中 sni 是第一类 Stirling 数。(不要问我为什么是这个,我不知道……)
由于对于第一类 Stirling 数我们有:
Sn=x(x−1)(x−2)⋯(x−n+1)
=∑ni=1(x+1−i)
用多项式表示则为:
Sn=∑ni=1sinxi
则我们的 dp 方程可以表示为:
dpn=∑ni=1|sin|xi
由 sin=(−1)n+i|sin| 得:
dpn=∑ni=1(−1)n+isinxi
因此我们只要求的 Stirling 数就可以得到我们对应的dp值。
然而我们怎么去求 Stirling 数呢?看到多个多项式相乘,很容易我们可以想到用 FFT 去优化,但是如果是简单的从左往右做 n−1 次 FFT 的话,显然复杂度爆表。
那我们该怎么办呢?
这时候一个自然的想法是对 FFT 之间的乘法分治!因为我们用高阶多项式和低阶多项式相乘,会导致很多时间上的浪费,这时候我们就可以考虑用类似于启发式合并的思想去进行多项式乘法:每次取出阶数最小的两个多项式进行 FFT ,这样我们复杂度就保证了。(这个过程可以用优先队列实现)
最后的答案即:
ans=(n2)!(n!)2∏ni=1dpain
其中 ai 为输入数据。这里还有个问题,就是 (n2)! 太大了怎么办?这个好说,打个表呗(对于给定的模数P,注意到 n2≥P 时 ans=0 )
时间复杂度即:
n2⋅2log2+n4⋅4log4+⋯+2⋅n2logn2+nlogn
=∑logni=1nlogi
=O(nlog2n)
然后由于题目给的模数P=999948289恰为费马素数,因此我们可以将 FFT 换成 NTT 来保证答案精度。(算法中我用的原根为 g=13 )
时间复杂度: O(nlog2n)
空间复杂度: O(→_→ 看脸 )
my code:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
using namespace std ;
typedef long long LL ;
#define clr( a , x ) memset ( a , x , sizeof a )
#define cpy( a , x ) memcpy ( a , x , sizeof a )
const int mod = 999948289 ;
const int MAXN = 100005 ;
const int g = 13 ;
struct Node {
int idx , n ;
Node () {}
Node ( int idx , int n ) : idx ( idx ) , n ( n ) {}
bool operator < ( const Node& a ) const {
if ( n != a.n ) return n > a.n ;
return idx > a.idx ;
}
} ;
vector < int > G[MAXN] ;
int x1[MAXN << 1] , x2[MAXN << 1] ;
int A[MAXN] ;
int f[MAXN] ;
int invf[MAXN] ;
int ff[MAXN] = { 69882273 , 791556261 , 443386966 , 216976807 , 615450328 , 620200386 , 446861303 , 527234626 , 385874772 , 122958863 , 35106575 , 469506825 , 849117472 , 793958001 , 452020289 , 4676385 , 668325472 , 90765471 , 741173520 , 292960868 , 794676333 , 906146069 , 259388637 , 95564208 , 271378066 , 312670526 , 893812493 , 998708474 , 266936264 , 418472146 , 482986423 , 293590649 , 946169270 , 322072286 , 298345339 , 708799889 , 729159009 , 947001046 , 713317958 , 528716034 , 659041757 , 923462973 , 108308863 , 810503508 , 691257344 , 44577283 , 303671798 , 26378399 , 968330581 , 133269594 , 629464814 , 383701511 , 107248414 , 756713235 , 682608228 , 45243233 , 29730607 , 928129208 , 77919155 , 577456879 , 477803768 , 241372843 , 273974160 , 135004679 , 18759653 , 921263284 , 927413084 , 571173344 , 849450420 , 280001219 , 280182102 , 471765511 , 552617665 , 678536791 , 719472567 , 409339140 , 833786546 , 199547621 , 504095173 , 73474955 , 235191090 , 25104958 , 702175539 , 664805355 , 384892206 , 919753472 , 570055488 , 517633839 , 946666972 , 418236783 , 141526729 , 401116525 , 364688445 , 351756910 , 929978083 , 744127744 , 410219723 , 903386921 , 10397619 , 292672496 , 345067388 , 523552083 , 421189060 , 772817702 , 702067604 , 407656772 , 838558008 , 366888490 , 733265485 , 101935555 , 465758684 , 456247580 , 49863634 , 940044402 , 208594100 , 475713181 , 591757338 , 426885417 , 574731054 , 306371541 , 580478774 , 700520798 , 604854237 , 628550010 , 614229828 , 596800066 , 186387316 , 428172129 , 441880990 , 908572606 , 161165821 , 135821670 , 39451264 , 636759055 , 248637650 , 900422956 , 987575526 , 146206173 , 144378428 , 984859458 , 945906788 , 614390815 , 959944022 , 573872290 , 482372774 , 700686219 , 683213989 , 603202477 , 578490080 , 15742988 , 953766856 , 343303448 , 293406332 , 910923238 , 466673107 , 230287260 , 31971863 , 412089584 , 415333822 , 5141190 , 78605027 , 168358509 , 581312160 , 998023617 , 893397256 , 822435495 , 57995800 , 705434759 , 572795704 , 166516606 , 161037416 , 168383845 , 869558200 , 322925569 , 433667444 , 642355815 , 448674266 , 135859659 , 224084982 , 993174767 , 466259649 , 513816219 , 153089740 , 789274830 , 393717679 , 563790438 , 667097553 , 246990172 , 82605246 , 854203585 , 552829545 , 854722457 , 723501019 , 423365839 , 267064284 , 856423915 , 79584268 , 653242694 , 334763889 , 946460749 , 495779508 , 678581977 , 572159717 , 801113676 , 17694875 , 489346941 , 520159316 , 712451262 , 512646102 , 98625173 , 281075174 , 126417219 , 443999667 , 829419892 , 481590520 , 624462589 , 706625430 , 334382549 , 396548707 , 457126026 , 771344797 , 196886249 , 171055541 , 311675783 , 956293535 , 696313936 , 128241027 , 336034496 , 523418062 , 798763948 , 84111300 , 800829312 , 625395544 , 500614440 , 693667842 , 961074871 , 626146398 , 545195644 , 926642113 , 687804010 , 847697467 , 641757700 , 868085106 , 491400010 , 927203814 , 381828916 , 916240332 , 85588576 , 466472554 , 858022328 , 664854550 , 480579956 , 515869204 , 880403159 , 713886759 , 337584729 , 706212548 , 510425383 , 654180230 , 959126384 , 255081030 , 935661083 , 751998379 , 844579617 , 943872436 , 706307343 , 546052985 , 669561488 , 603243382 , 766885812 , 178767339 , 951085566 , 851956883 , 481179237 , 597706499 , 394183053 , 293629880 , 413856189 , 214329561 , 213811293 , 430994640 , 855683642 , 120274250 , 814481427 , 666912447 , 862912318 , 907474880 , 563341124 , 102962767 , 364221323 , 336078158 , 513727019 , 626546332 , 894589534 , 264876061 , 610304218 , 383451496 , 903153841 , 327485311 , 475386192 , 492451940 , 423665925 , 997135284 , 195941463 , 445032717 , 956018500 , 911453634 , 96056536 , 896059204 , 651582680 , 306146295 , 469553736 , 900398557 , 570560384 , 162249798 , 244848963 , 732627210 , 946697553 , 635002635 , 452231824 , 77896604 , 136484860 , 879392754 , 126087417 , 584820990 , 136525199 , 109255745 , 235719082 , 933547861 , 138567112 , 639794200 , 580152595 , 625589203 , 733876837 , 101259850 , 552418145 , 813660931 , 196519288 , 456976229 , 25421384 , 712595297 , 704541085 , 557447132 , 90748767 , 20095929 , 968079867 , 439274655 , 892061081 , 631420710 , 761708823 , 63522826 , 375326405 , 847336986 , 229962565 , 432855344 , 379698327 , 564009295 , 941159124 , 559880756 , 930461914 , 476237204 , 178783982 , 396056996 , 228899021 , 752980027 , 874998159 , 223708216 , 172123540 , 622548375 , 274778429 , 814215923 , 734898238 , 638935987 , 241179940 , 987124093 , 794533496 , 937652043 , 983690543 , 493138649 , 403470735 , 195081860 , 320077468 , 785942949 , 256840417 , 153936326 , 547495244 , 636860057 , 993903452 , 480618639 , 567272415 , 607857590 , 568841890 , 153037457 , 413267013 , 800156606 , 287349476 , 153526493 , 33811963 , 667053655 , 730239961 , 30990337 , 884437514 , 423134555 , 482877273 , 716706877 , 79961414 , 153113282 , 426720544 , 408302696 , 457792636 , 982630227 , 820109433 , 663817234 , 966021112 , 512724775 , 496648265 , 952105142 , 834779459 , 340883527 , 86826201 , 208293269 , 262036542 , 465900101 , 184164779 , 922046925 , 287059785 , 164659088 , 845210103 , 984453191 , 958388335 , 123500283 , 483136423 , 93579300 , 221906912 , 923056607 , 581355334 , 257166825 , 35007443 , 173231747 , 300723407 , 570655111 , 239210038 , 328605627 , 827131050 , 883190274 , 502720573 , 842111854 , 663437999 , 588819297 , 528736498 , 736629016 , 205830419 , 520959797 , 767718942 , 996330390 , 378723801 , 922056580 , 828269403 , 355848593 , 654685459 , 579356774 , 224993757 , 563992210 , 34354314 , 41127812 , 487011765 , 743948237 , 42607233 , 793179355 , 922099087 , 795236763 , 104970413 , 137850518 , 323153445 , 844832100 , 335643302 , 602541999 , 506172202 , 184092356 , 426730643 , 625482293 , 968516614 , 287803058 , 941992949 , 454653688 , 362923901 , 15056006 , 79846658 , 137511716 , 325105470 , 565980790 , 518728236 , 405581353 , 634222533 , 447811637 , 671699463 , 9153273 , 174178785 , 991733853 , 177850771 , 233908440 , 330759922 , 270473391 , 120005719 , 328321673 , 742704498 , 522741629 , 728167412 , 884961232 , 879549768 , 887503752 , 262603856 , 663798514 , 963330659 , 100713216 , 880492916 , 543224716 , 487585183 , 7373897 , 562827165 , 342089383 , 231928715 , 458070746 , 461590267 , 989826760 , 251912942 , 373406560 , 738456792 , 315104902 , 690802034 , 172564163 , 807387201 , 446915848 , 444169919 , 3254250 , 116134967 , 157352193 , 278465933 , 977246804 , 460721567 , 633930865 , 588191311 , 126693578 , 606158621 , 222734769 , 48475104 , 568157953 , 927325187 , 67358120 , 820035600 , 687758215 , 725002146 , 769772598 , 932649813 , 797388164 , 539428861 , 368607052 , 378603176 , 634775529 , 699800232 , 321483965 , 279494988 , 976903837 , 592259353 , 184043602 , 531453990 , 842072702 , 768435762 , 294653272 , 837780286 , 835240007 , 882398267 , 508522223 , 804586121 , 250194887 , 14077583 , 360232823 , 288596963 , 710322941 , 164774727 , 562173265 , 465999135 , 401602179 , 999448184 , 248529438 , 388455137 , 462263760 , 104181526 , 290036210 , 452689549 , 993107251 , 545214312 , 624857376 , 213784660 , 720311222 , 10567316 , 624219369 , 453475724 , 12170781 , 635988144 , 415953655 , 910063428 , 940043264 , 663497852 , 459812153 , 713738904 , 402284167 , 233273213 , 436363830 , 547141750 , 645992377 , 157237863 , 115901665 , 572862631 , 558648869 , 290487718 , 404995907 , 934894741 , 784395003 , 166416663 , 895361111 , 562589658 , 961345846 , 444583454 , 563961881 , 444521940 , 413060059 , 258946869 , 918512528 , 399217777 , 288820547 , 127922835 , 907380975 , 539847308 , 194943546 , 783183611 , 526612272 , 607466731 , 597518432 , 753564534 , 145244826 , 53356822 , 668767501 , 917660707 , 791363628 , 873865188 , 754625043 , 75627876 , 329167756 , 109205633 , 289852337 , 943918898 , 410362534 , 958996738 , 347876644 , 74386839 , 348129015 , 986156066 , 857166465 , 92339218 , 234541783 , 935939427 , 737280793 , 728409172 , 126599226 , 896812051 , 644061170 , 932429377 , 290089424 , 808444548 , 758828389 , 449044940 , 597079020 , 584375293 , 553677062 , 490868858 , 107202669 , 882290559 , 724836565 , 948688036 , 293126814 , 652642166 , 709962599 , 112254976 , 957391661 , 189735497 , 27787352 , 258595651 , 875794763 , 344943006 , 459699983 , 779124068 , 242241547 , 393859356 , 760957472 , 877232553 , 440705326 , 959517034 , 505374815 , 35108527 , 51941195 , 942223277 , 86905956 , 274848272 , 293506405 , 907723656 , 497947456 , 393087291 , 398037754 , 121598763 , 232144028 , 591318742 , 778260280 , 296460416 , 442712280 , 229081970 , 83187891 , 152878902 , 58134845 , 32118829 , 270379787 , 204466744 , 378473059 , 541927089 , 905669511 , 450272138 , 49693392 , 490848880 , 141415171 , 615897904 , 549583527 , 218364809 , 260578555 , 771474057 , 380010129 , 383697701 , 59476689 , 197974682 , 62311567 , 614700290 , 945607981 , 580141879 , 364627623 , 825940168 , 432176905 , 886830329 , 624113027 , 373134390 , 3624311 , 630786212 , 677523637 , 898691846 , 127067438 , 908076025 , 371825879 , 567986890 , 698070761 , 869858982 , 508673575 , 40774280 , 156538688 , 226364986 , 800667727 , 675844125 , 267792942 , 680392510 , 292572755 , 997152235 , 547699475 , 952197906 , 217521334 , 320499148 , 342712538 , 888666275 , 393626985 , 451815656 , 230294621 , 426050340 , 465212052 , 133318659 , 586180960 , 970944670 , 38793481 , 20061168 , 986395939 , 239739019 , 339616855 , 594376766 , 260447199 , 519596678 , 553065488 , 465912604 , 770580728 , 869874189 , 246904788 , 94481443 , 48601881 , 4007176 , 160855859 , 124996407 , 49901709 , 264920367 , 470191858 , 685617453 , 929490173 , 734566387 , 255657601 , 649495111 , 467955866 , 423046166 , 57818945 , 564095879 , 921160407 , 496919993 , 849252865 , 542906152 , 436890148 , 399145512 , 569335744 , 775449829 , 691704409 , 748585910 , 873162972 , 747573203 , 579610029 , 995841512 , 508638032 , 661327227 , 168348266 , 647999270 , 472814117 , 537204701 , 743050918 , 505654858 , 804496062 , 103128634 , 414307482 , 577643489 , 525012382 , 351140781 , 391130511 , 852703045 , 60224751 , 983250374 , 723239627 , 116748847 , 162765489 , 304238235 , 580733772 , 578302313 , 921055970 , 130296719 , 564247321 , 226244861 , 678040840 , 936226561 , 784203456 , 722625922 , 27404584 , 597150412 , 954289593 , 654814409 , 927991004 , 162445852 , 682728416 , 643936903 , 408009707 , 259101129 , 316815527 , 838855414 , 62969134 , 647843058 , 296505125 , 136222214 , 280114658 , 674739161 , 399497483 , 77767868 , 666409066 , 680920629 , 823404901 , 856973432 , 636921766 , 569004500 , 491717880 , 16246940 , 343337017 , 87523073 , 75791793 , 851609146 , 613364476 , 639003 , 447341119 , 513099283 , 302211516 , 582447665 , 550670777 , 339730219 , 289286185 , 841350829 , 52966333 , 401958184 , 110201859 , 170541391 , 293793132 , 460292990 , 255441796 , 594789035 , 974361464 , 164898662 , 715508390 , 598492098 , 954998960 , 622517573 , 145720445 , 980278399 , 847131191 , 792784293 , 35424278 , 168101124 , 122625582 , 148102086 , 436077724 , 439606682 , 863763585 , 884763606 , 978514101 , 236525338 , 246790692 , 889384599 , 860660877 , 605992029 , 76015181 , 637252729 , 892083627 , 336822184 , 832783274 , 267912179 , 520907876 , 33986639 , 170117849 , 965267478 , 916748474 , 855449768 , 528877922 , 913688701 , 751563586 , 823525161 , 17497538 , 305868835 , 790306522 , 917156691 , 496104717 , 522052365 , 414224474 , 249916805 , 468624266 , 418454382 , 826856669 , 938064651 , 622495105 , 910820222 , 154819386 , 121109106 , 256332596 , 29582281 , 297482426 , 6959983 , 927128898 , 534235829 , 501462578 , 555527765 , 213800973 , 424702537 , 834286273 , 722387908 , 381978926 , 822283522 , 554643366 , 475401659 , 821119927 , 99155414 , 748958472 , 75255490 , 297807089 , 188353653 , 616207495 , 493847595 , 776463788 , 540551643 , 679408122 , 272322394 , 13015400 , 536842566 , 37953628 , 495004185 , 827872604 , 947611149 , 276847369 , 0 } ;
int m , root ;
int power ( int a , int b ) {
LL res = 1 , tmp = a ;
while ( b ) {
if ( b & 1 ) res = res * tmp % mod ;
tmp = tmp * tmp % mod ;
b >>= 1 ;
}
return ( int ) res ;
}
void NTT ( int y[] , int n , int rev ) {
for ( int i = 1 , j , k , t ; i < n ; ++ i ) {
for ( j = 0 , k = n >> 1 , t = i ; k ; k >>= 1 , t >>= 1 ) j = j << 1 | t & 1 ;
if ( i < j ) swap ( y[i] , y[j] ) ;
}
for ( int s = 2 , ds = 1 ; s <= n ; ds = s , s <<= 1 ) {
int wn = power ( g , ( mod - 1 ) / s ) ;
if ( rev < 0 ) wn = power ( wn , mod - 2 ) ;
for ( int k = 0 , w = 1 ; k < ds ; ++ k , w = ( LL ) w * wn % mod ) {
for ( int i = k , t ; i < n ; i += s ) {
y[i + ds] = ( y[i] - ( t = ( LL ) w * y[i + ds] % mod ) + mod ) % mod ;
y[i] = ( y[i] + t ) % mod ;
}
}
}
if ( rev < 0 ) {
int inv = power ( n , mod - 2 ) ;
for ( int i = 0 ; i < n ; ++ i ) y[i] = ( LL ) y[i] * inv % mod ;
}
}
void solve () {
priority_queue < Node > q ;
for ( int i = 1 ; i <= m ; ++ i ) {
scanf ( "%d" , &A[i] ) ;
G[i].clear () ;
}
if ( ( LL ) m * m >= mod ) {
printf ( "0\n" ) ;
return ;
}
for ( int i = 1 ; i <= m ; ++ i ) {
G[i].push_back ( ( 1 - i + mod ) % mod ) ;
G[i].push_back ( 1 ) ;
q.push ( Node ( i , 2 ) ) ;
}
while ( !q.empty () ) {
int x = q.top ().idx ;
q.pop () ;
if ( q.empty () ) {
root = x ;
break ;
}
int y = q.top ().idx ;
q.pop () ;
int n1 = G[x].size () , n2 = G[y].size () , nn = n1 + n2 - 1 ;
int n = 1 ;
while ( n < nn ) n <<= 1 ;
for ( int i = 0 ; i < n ; ++ i ) x1[i] = i < n1 ? G[x][i] : 0 ;
for ( int i = 0 ; i < n ; ++ i ) x2[i] = i < n2 ? G[y][i] : 0 ;
NTT ( x1 , n , 1 ) ;
NTT ( x2 , n , 1 ) ;
for ( int i = 0 ; i < n ; ++ i ) x1[i] = ( LL ) x1[i] * x2[i] % mod ;
NTT ( x1 , n , -1 ) ;
G[x].clear () ;
for ( int i = 0 ; i < nn ; ++ i ) G[x].push_back ( x1[i] ) ;
q.push ( Node ( x , nn ) ) ;
}
int ans = power ( invf[m] , m ) ;
int mm = m * m , x ;
for ( x = 0 ; x + 1000000 <= mm ; x += 1000000 ) ans = ( LL ) ans * ff[x / 1000000] % mod ;
for ( ++ x ; x <= mm ; ++ x ) ans = ( LL ) ans * x % mod ;
for ( int i = 1 ; i <= m ; ++ i ) {
if ( ( m + A[i] ) % 2 == 0 ) ans = ( LL ) ans * G[root][A[i]] % mod ;
else ans = ( LL ) ans * ( mod - G[root][A[i]] ) % mod ;
}
printf ( "%d\n" , ans ) ;
}
int main () {
f[0] = 1 ;
for ( int i = 1 ; i < MAXN ; ++ i ) {
f[i] = ( LL ) i * f[i - 1] % mod ;
invf[i] = power ( f[i] , mod - 2 ) ;
}
while ( ~scanf ( "%d" , &m ) ) solve () ;
return 0 ;
}