problem1
两个数字后面都有阶乘符号,可以抵消。
import java.util.*;import java.math.*;import static java.lang.Math.*;public class ExtraordinarilyLarge { public String compare(String x, String y) { boolean both=false; while(x.endsWith("!")&&y.endsWith("!")) { x=x.substring(0,x.length()-1); y=y.substring(0,y.length()-1); both=true; } boolean bswap=false; if(x.endsWith("!")) { String t=new String(x); x=y; y=t; bswap=true; } long xx=Long.valueOf(x); if(xx==0&&both) { xx=1; } long yy=1; if(y.endsWith("!")) { int id=y.indexOf("!"); yy=Long.valueOf(y.substring(0,id)); final int num=y.length()-id; for(int i=0;i<=xx;++i) { yy=cal(yy,xx); } } else { yy=Long.valueOf(y); if(yy==0&&both) { yy=1; } } if(xx y"; } return "x y"; } } long cal(long x,long y) { if(x==0) { return 1; } long result=1; for(int i=2;i<=x;++i) { if(result<=y/i) { result=result*i; } else { return y+1; } } return result; }}
problem2
在一个有向无环图上进行dp即可。
import java.util.*;import java.math.*;import static java.lang.Math.*;public class ContestSchedule { public double expectedWinnings(String[] contests) { final int n=contests.length; int[][] p=new int[n][3]; for(int i=0;iqueue=new LinkedList<>(); double[] f=new double[n]; boolean[] inq=new boolean[n]; for(int i=0;i f[i]) { f[i]=f[u]+c; if(!inq[i]) { inq[i]=true; queue.offer(i); } } } } } double result=0; for(int i=0;i
problem3
$n,m$中小的那个必定小于9.这样一行一行进行dp即可。
import com.sun.org.apache.xpath.internal.operations.Bool;import java.util.*;import java.math.*;import static java.lang.Math.*;public class SeatingPlan { public String expectedTrial(int m, int n, int k) { if(n>1]+(i&1); } List g=new ArrayList<>(); for(int i=0;i<(1<
list=new ArrayList<>(); if(((i>>1)&i)!=0) { g.add(list); continue; } for(int j=0;j<(1< >1)&j)==0) { list.add(j); } } g.add(list); } f[0][0][0]=1; for(int i=1;i<=n;++i) { for(int j=0;j<(1< k) { continue; } f[i][s][t+num[s]]+=f[i-1][j][t]; } } } } long result=0; for(int i=0;i<(1<