最近感觉打CF各种车祸。。。。。感觉要反思一下,
上次读错题,这次想当然地以为18!肯定暴了longlong 而没有去实践,
这个题我看到就感觉是枚举每个数字的个数,但是我觉得算得时候会爆longlong
就想用大数,但是我去看别人交的全部都是C++,就感觉是不是有别的方法,
想了半天感觉时间来不及了就强行上了个java,结果时间来不及。。。
以后写题首先要读清楚题目,其次不要想当然,要去实践!!!!!!!!!!! 真的很烦。
import java.math.BigInteger; import java.util.*; public class Main { static long n; static int cnt[] = new int[10]; static int num[] = new int[10]; static long f[] = new long[20]; static long ans = 0; static long one = 1000000000; static long base = one * one; public static void main(String arg[]) { f[0] = 1; for(int i = 1; i <= 18; i++) { f[i] = f[i - 1] * i; } Scanner in = new Scanner(System.in); n = in.nextLong(); if(n == base) { System.out.println("18"); } else { while(n > 0) { int ret = (int)(n % 10); cnt[ret]++; n /= 10; } for(int i = 0; i < 10; i++) { if(cnt[i] > 0) { num[i] = 1; cnt[i]--; } } dfs(0); System.out.println(ans); } in.close(); } public static void dfs(int p) { //System.out.println("#####"); ans += cal(); for(int i = p; i <= 9; i++) { if(cnt[i] == 0) continue; cnt[i]--; num[i]++; dfs(i); num[i]--; cnt[i]++; } } public static long cal() { int sum = 0; long ans = 0, ret = 0; for(int i = 0; i <= 9; i++) sum += num[i]; ans = f[sum]; for(int i = 0; i <= 9; i++) { if(num[i] > 0)ans /= f[num[i]]; } if(num[0] > 0) { ret = f[sum - 1]; ret /= f[num[0] - 1]; for(int i = 1; i <= 9; i++) { if(num[i] > 0) { ret /= f[num[i]]; } } } return ans - ret; } }