/*比賽的時候沒有寫出來,賽後請教大牛後寫的可以先求出(xyz,xzy)的總數量只需出去x後面多少個比它大的個數n,C(n,2)就是瞭然後求出xyz的個數,對於a,求出比a小的個數low[a],比a大的個數high[a],low[a]*high[a]就是答案可以藉助樹狀數組求上述個數*/#include <cstdio>#include <iostream>#include <memory.h>using namespace std;const int MAX=100100;const __int64 mod=100000007;__int64 C[MAX];__int64 low[MAX];//low[a],在a前面比a小的個數__int64 high[MAX];//high[a],在a後面比a大的個數int Case;int n;int data[MAX];int low_bit(int x) {return x&(-x);}void add_up(int x) {while(x<=n) {C[x]+=1;x+=low_bit(x);}}__int64 sum(int x) {__int64 s=0;while(x) {s+=C[x];x-=low_bit(x);}return s;}void solve() {Case++;__int64 a=0, b=0;scanf("%d", &n);memset(C, 0, sizeof(C));for(int i=1;i<=n;i++) {scanf("%d", &data[i]);low[i]=sum(data[i]);high[i]=n-data[i]-i+1+low[i];add_up(data[i]);}for(int i=1;i<=n;i++) {b=((b+low[i]*high[i])%mod+mod)%mod;}for(int i=1;i<=n;i++) {a=((a+high[i]*(high[i]-1)/2)%mod+mod)%mod;}printf("Case #%d: ", Case);printf("%I64d\n", (a-b+mod)%mod);}int main () {int T;scanf("%d", &T);while(T--)solve();return 0;}