Skip to content

Commit 6db4d2b

Browse files
committed
fix bug
1 parent 4ac9082 commit 6db4d2b

File tree

1 file changed

+20
-11
lines changed
  • codeforces/round232/div1

1 file changed

+20
-11
lines changed

codeforces/round232/div1/d.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void init(){
2828
t = ( i - 1) / 2 * i ;
2929
invs[i] = ( ( i * invs[i-1] ) % BIG_PRIME + ( fac[i-1] * t ) % BIG_PRIME ) % BIG_PRIME ;
3030
}
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]) ;
3232
}
3333

3434
lld lowbit(lld x){
@@ -53,22 +53,30 @@ int main(){
5353
lld i , result = 0 ;
5454
while(scanf("%lld", &n) !=EOF )
5555
{
56-
for(i = 0 ; i < n; ++ i) scanf("%lld", &p[i]);
56+
for(i = 1; i <= n; ++ i) scanf("%lld", &p[i]);
5757
result = 0 ;
5858
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 ;
6669
result = (result + t) % BIG_PRIME ;
6770
//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 ;
6972
insert(p[i], 1) ;
73+
74+
//printf("###%lld\n", sv) ;
75+
//printf("$ :%lld\n", result) ;
76+
7077
}
71-
printf("%lld\n", result);
78+
//printf("%lld\n", sv) ;
79+
printf("%lld\n", (result + sv) % BIG_PRIME );
7280
//memset(bit, 0 , sizeof(bit)) ;
7381

7482
//for(i = 0 ; i < n ; ++ i) {
@@ -79,5 +87,6 @@ int main(){
7987
//}
8088
//printf("%lld\n", result) ;
8189
}
90+
return 0 ;
8291
}
8392

0 commit comments

Comments
 (0)