@@ -28,7 +28,7 @@ void init(){
28
28
t = ( i - 1 ) / 2 * i ;
29
29
invs[i] = ( ( i * invs[i-1 ] ) % BIG_PRIME + ( fac[i-1 ] * t ) % BIG_PRIME ) % BIG_PRIME ;
30
30
}
31
- // for(i = 1 ; i <= 5 ; ++ i) printf("invs[%lld]=%lld\n", i, invs[i]) ;
31
+ // for(i = 1 ; i <= 6 ; ++ i) printf("invs[%lld]=%lld\n", i, invs[i]) ;
32
32
}
33
33
34
34
lld lowbit (lld x){
@@ -53,22 +53,30 @@ int main(){
53
53
lld i , result = 0 ;
54
54
while (scanf (" %lld" , &n) !=EOF )
55
55
{
56
- for (i = 0 ; i < n; ++ i) scanf (" %lld" , &p[i]);
56
+ for (i = 1 ; i <= n; ++ i) scanf (" %lld" , &p[i]);
57
57
result = 0 ;
58
58
memset (bit, 0 , sizeof (bit)) ;
59
- lld sv = 0 , t, pi_less , pi_less_unused;
60
- for (i = 0 ; i < n; ++ i){
61
- pi_less = sum (p[i]) ;
62
- pi_less_unused = p[i] - 1 - pi_less ;
63
- result = (result + pi_less_unused * invs[n - i]) % BIG_PRIME ;
64
- t = sv * pi_less_unused % BIG_PRIME ;
65
- t = t * fac[n - i - 1 ] % BIG_PRIME ;
59
+ lld sv = 0 , t, b;
60
+ for (i = 1 ; i <= n; ++ i){
61
+ // from [i+1..n]
62
+ b = p[i] - 1 - sum (p[i]);
63
+ result = (result + b * invs[n - i]) % BIG_PRIME ;
64
+ // from [i..i]
65
+ lld tb = b * (b - 1 ) / 2 % BIG_PRIME ;
66
+ result = (result + tb * fac[n - i] % BIG_PRIME ) % BIG_PRIME ;
67
+ // from [0..i-1]
68
+ t = ( sv * b % BIG_PRIME ) * fac[n - i] % BIG_PRIME ;
66
69
result = (result + t) % BIG_PRIME ;
67
70
// p[0], p[1], p[2]...p[i-1] participate inversions (p[k], x); (0<=k<=i-1)
68
- sv = (sv + (i - sum (p[i])) ) % BIG_PRIME ;
71
+ sv = (sv + (p[i] - 1 - sum (p[i])) ) % BIG_PRIME ;
69
72
insert (p[i], 1 ) ;
73
+
74
+ // printf("###%lld\n", sv) ;
75
+ // printf("$ :%lld\n", result) ;
76
+
70
77
}
71
- printf (" %lld\n " , result);
78
+ // printf("%lld\n", sv) ;
79
+ printf (" %lld\n " , (result + sv) % BIG_PRIME );
72
80
// memset(bit, 0 , sizeof(bit)) ;
73
81
74
82
// for(i = 0 ; i < n ; ++ i) {
@@ -79,5 +87,6 @@ int main(){
79
87
// }
80
88
// printf("%lld\n", result) ;
81
89
}
90
+ return 0 ;
82
91
}
83
92
0 commit comments