OJ-Problems-Source/HDOJ/5197_autoAC.cpp

114 lines
15 KiB
C++
Raw Normal View History

#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 , 557447
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 ;
}