Submission #946560


Source Code Expand

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.InputMismatchException;

public class Main {
	static InputStream is;
	static PrintWriter out;
	static String INPUT = "";
	
	static void solve()
	{
		int n = ni();
		int[] a = na(n);
		int[] zs = new int[n+1];
		
		int[] pre = new int[n];
		int[] lower = new int[n];
		Arrays.fill(lower, -1);
		int[] fl = new int[n+3];
		for(int i = n-1;i >= 0;i--){
			if(a[i] != 0){
				pre[a[i]-1] += 1;
				lower[i] = sumFenwick(fl, a[i]-1);
				addFenwick(fl, a[i]-1, 1);
			}
		}
		for(int i = 0;i < n;i++){
			if(pre[i] >= 2){
				out.println(0);
				return;
			}
			zs[i+1] = zs[i] + 1 - pre[i];
		}
//		tr(zs);
		long F = 1;
		int mod = 1000000007;
		// 2*2+1*2+0*2
		// (3*6+2*6+1*6+0*6)*6
		// 6*6*6
		// 3*2*4*2
		// 1*1*12*1
		// 216+48+12
		long OFS = 1;
		{
			int space = 0;
			for(int i = n-1;i >= 0;i--){
				if(a[i] == 0){
					space++;
					OFS = OFS * space % mod;
				}
			}
		}
		
		int space = 0;
		long ret = 0;
		long ret2 = 0;
		long ret3 = 0;
		long FS = 1;
		// 24 3
		// 23 2
		// 4 2
		long lowsum = 0;
		for(int i = n-1;i >= 0;i--){
			if(a[i] == 0){
//				tr(space, (long)space*(space+1)/2, F);
				ret = ret * (space+1) % mod;
				ret += (long)space*(space+1)/2%mod*F%mod*FS%mod;
				
				ret3 += lowsum%mod*F%mod*OFS%mod*invl(zs[n],mod)%mod;
				
				// 3*6 + 3*2
				space++;
				FS = FS * space % mod;
			}else{
				// l h
				// l/(l+h)*OFS*d*F
				ret2 += lower[i] * OFS % mod * F % mod;
				int los = zs[a[i]-1];
				ret2 += los*invl(zs[n], mod) % mod * OFS % mod * space % mod * F % mod;
				
				lowsum += zs[n]-los;
			}
			F = F * (n-i) % mod;
		}
		ret += ret2;
		ret += ret3;
		ret += FS;
		
		ret%=mod;
		out.println(ret);
	}
	
	public static long invl(long a, long mod) {
		long b = mod;
		long p = 1, q = 0;
		while (b > 0) {
			long c = a / b;
			long d;
			d = a;
			a = b;
			b = d % b;
			d = p;
			p = q;
			q = d - c * q;
		}
		return p < 0 ? p + mod : p;
	}

	
	public static int sumFenwick(int[] ft, int i)
	{
		int sum = 0;
		for(i++;i > 0;i -= i&-i)sum += ft[i];
		return sum;
	}
	
	public static void addFenwick(int[] ft, int i, int v)
	{
		if(v == 0 || i < 0)return;
		int n = ft.length;
		for(i++;i < n;i += i&-i)ft[i] += v;
	}

	
	public static void main(String[] args) throws Exception
	{
		long S = System.currentTimeMillis();
		is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
		out = new PrintWriter(System.out);
		
		solve();
		out.flush();
		long G = System.currentTimeMillis();
		tr(G-S+"ms");
	}
	
	private static boolean eof()
	{
		if(lenbuf == -1)return true;
		int lptr = ptrbuf;
		while(lptr < lenbuf)if(!isSpaceChar(inbuf[lptr++]))return false;
		
		try {
			is.mark(1000);
			while(true){
				int b = is.read();
				if(b == -1){
					is.reset();
					return true;
				}else if(!isSpaceChar(b)){
					is.reset();
					return false;
				}
			}
		} catch (IOException e) {
			return true;
		}
	}
	
	private static byte[] inbuf = new byte[1024];
	static int lenbuf = 0, ptrbuf = 0;
	
	private static int readByte()
	{
		if(lenbuf == -1)throw new InputMismatchException();
		if(ptrbuf >= lenbuf){
			ptrbuf = 0;
			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
			if(lenbuf <= 0)return -1;
		}
		return inbuf[ptrbuf++];
	}
	
	private static boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
//	private static boolean isSpaceChar(int c) { return !(c >= 32 && c <= 126); }
	private static int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
	
	private static double nd() { return Double.parseDouble(ns()); }
	private static char nc() { return (char)skip(); }
	
	private static String ns()
	{
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while(!(isSpaceChar(b))){
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}
	
	private static char[] ns(int n)
	{
		char[] buf = new char[n];
		int b = skip(), p = 0;
		while(p < n && !(isSpaceChar(b))){
			buf[p++] = (char)b;
			b = readByte();
		}
		return n == p ? buf : Arrays.copyOf(buf, p);
	}
	
	private static char[][] nm(int n, int m)
	{
		char[][] map = new char[n][];
		for(int i = 0;i < n;i++)map[i] = ns(m);
		return map;
	}
	
	private static int[] na(int n)
	{
		int[] a = new int[n];
		for(int i = 0;i < n;i++)a[i] = ni();
		return a;
	}
	
	private static int ni()
	{
		int num = 0, b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private static long nl()
	{
		long num = 0;
		int b;
		boolean minus = false;
		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
		if(b == '-'){
			minus = true;
			b = readByte();
		}
		
		while(true){
			if(b >= '0' && b <= '9'){
				num = num * 10 + (b - '0');
			}else{
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private static void tr(Object... o) { if(INPUT.length() != 0)System.out.println(Arrays.deepToString(o)); }
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User uwi
Language Java8 (OpenJDK 1.8.0)
Score 1200
Code Size 5559 Byte
Status AC
Exec Time 412 ms
Memory 19016 KB

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 500 / 500 700 / 700
Status
AC × 5
AC × 33
AC × 58
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt
Subtask 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 2_033.txt, 2_034.txt, 2_035.txt, 2_036.txt, 2_037.txt, 2_038.txt, 2_039.txt, 2_040.txt, 2_041.txt, 2_042.txt, 2_043.txt, 2_044.txt, 2_045.txt, 2_046.txt, 2_047.txt, 2_048.txt, 2_049.txt, 2_050.txt, 2_051.txt, 2_052.txt, 2_053.txt, 2_054.txt, 2_055.txt, 2_056.txt, 2_057.txt
Case Name Status Exec Time Memory
0_000.txt AC 98 ms 8020 KB
0_001.txt AC 97 ms 8148 KB
0_002.txt AC 98 ms 8020 KB
0_003.txt AC 97 ms 8144 KB
0_004.txt AC 98 ms 8148 KB
1_005.txt AC 97 ms 8148 KB
1_006.txt AC 98 ms 8148 KB
1_007.txt AC 96 ms 8148 KB
1_008.txt AC 103 ms 8268 KB
1_009.txt AC 100 ms 8144 KB
1_010.txt AC 104 ms 8404 KB
1_011.txt AC 101 ms 8272 KB
1_012.txt AC 102 ms 8272 KB
1_013.txt AC 99 ms 8272 KB
1_014.txt AC 106 ms 8400 KB
1_015.txt AC 100 ms 8144 KB
1_016.txt AC 103 ms 8276 KB
1_017.txt AC 97 ms 8140 KB
1_018.txt AC 103 ms 8272 KB
1_019.txt AC 100 ms 8268 KB
1_020.txt AC 104 ms 8400 KB
1_021.txt AC 100 ms 8144 KB
1_022.txt AC 105 ms 8276 KB
1_023.txt AC 110 ms 8404 KB
1_024.txt AC 104 ms 8276 KB
1_025.txt AC 98 ms 8144 KB
1_026.txt AC 102 ms 8276 KB
1_027.txt AC 108 ms 8148 KB
1_028.txt AC 99 ms 8404 KB
1_029.txt AC 103 ms 8404 KB
1_030.txt AC 102 ms 8276 KB
1_031.txt AC 102 ms 8400 KB
1_032.txt AC 103 ms 8272 KB
2_033.txt AC 280 ms 18880 KB
2_034.txt AC 200 ms 14028 KB
2_035.txt AC 312 ms 18888 KB
2_036.txt AC 323 ms 18240 KB
2_037.txt AC 337 ms 18884 KB
2_038.txt AC 300 ms 17728 KB
2_039.txt AC 352 ms 19008 KB
2_040.txt AC 241 ms 14012 KB
2_041.txt AC 412 ms 19016 KB
2_042.txt AC 170 ms 11060 KB
2_043.txt AC 325 ms 18884 KB
2_044.txt AC 265 ms 15700 KB
2_045.txt AC 317 ms 18900 KB
2_046.txt AC 330 ms 18500 KB
2_047.txt AC 341 ms 18884 KB
2_048.txt AC 223 ms 13380 KB
2_049.txt AC 334 ms 18884 KB
2_050.txt AC 259 ms 15552 KB
2_051.txt AC 255 ms 18900 KB
2_052.txt AC 248 ms 17876 KB
2_053.txt AC 274 ms 18876 KB
2_054.txt AC 281 ms 18896 KB
2_055.txt AC 242 ms 18896 KB
2_056.txt AC 246 ms 18892 KB
2_057.txt AC 265 ms 18892 KB