package yukicoder; import java.math.BigDecimal; import java.util.ArrayList; public class Main{ public static void main(String[] args) { new Main().solve(); } void solve() { int count=0; ArrayList used=new ArrayList<>(); for(long i=1_000_000_000L;i>=1;i--){ if(i*(i+1)<1_000_000_000_000_000_000L){ long d=i*(i+1)-1; while(!iscorrect(d,calc(d))){ if(used.contains(d))continue; System.out.println(d); used.add(d); d--; count++; if(count==10000)return; } } } } boolean iscorrect(long d, long ans) { if (ans * ans + ans <= d && (ans + 1) * (ans + 1) + (ans + 1) > d) { return true; } else return false; } long calc(long d) { return (long) ((-1 + Math.sqrt(1 + 4 * d)) / 2.0); } double calc_ori(long d) { return (-1 + Math.sqrt(1 + 4 * d)) / 2.0; } BigDecimal calc_ori_ex(long d) { return BigDecimal.valueOf(-1).add(sqrt(BigDecimal.valueOf(4 * d + 1), 100)).divide(BigDecimal.valueOf(2)); } void show(long d) { System.out.println("参加者の示すtの値" + calc(d)); System.out.println("t*t+t " + (calc(d) * calc(d) + calc(d))); System.out.println("(t+1)(t+1)+(t+1)" + ((calc(d) + 1) * (calc(d) + 1) + (calc(d) + 1))); System.out.println("d " + d); System.out.println("二次方程式を解いた時のtの値(参加者の)" + calc_ori(d)); System.out.println("二次方程式を解いた時のt(参加者の)でのt*t+t" + (calc_ori(d) * calc_ori(d) + calc_ori(d))); System.out.println("二次方程式を解いた時のtの値(精度を上げた)" + calc_ori_ex(d)); } // scaleは桁数。 public static BigDecimal sqrt(BigDecimal a, int scale) { BigDecimal x = a; for (int i = 0; i < 10000; i++) { // x=x-(x*x-a)/(2*x) x = x.subtract((x.multiply(x).subtract(a)).divide((x.multiply(BigDecimal.valueOf(2.0))), scale, BigDecimal.ROUND_HALF_EVEN)); } return x; } }