10183:
题意:
求a,b之间有多少个fib数。
大牛java代码 留着备用:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger[] f = new BigInteger[600];
f[0] = new BigInteger("1");
f[1] = new BigInteger("2");
for(int i = 2; i < 600; i ++)
f[i] = f[i - 1].add(f[i - 2]);
while(true)
{
BigInteger a, b;
int res = 0;
a = cin.nextBigInteger();
b = cin.nextBigInteger();
if(a.compareTo(BigInteger.ZERO) == 0 && b.compareTo(BigInteger.ZERO) == 0)
break;
for(int i = 0; i < 600; i ++)
if(f[i].compareTo(a) != -1 && f[i].compareTo(b) != 1)
res ++;
System.out.println(res);
}
}
}
10519:
题意:
问割圆割成几个面。
解析:
第n个圆与前面的n - 1个圆相交,多出 2 * ( n - 1)个面。
f(n) = f(n - 1)+ 2 * (n - 1),f(0) = 1
往下递推,f(n) = n * n - n + 2
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger n;
while(cin.hasNext())
{
n = cin.nextBigInteger();
if(n.equals(BigInteger.valueOf(0)))
System.out.println("1");
else
{
n = n.multiply(n).add(n.negate()).add(BigInteger.valueOf(2));
System.out.println(n);
}
}
}
}
10516:
解析:
满K叉树的前i层的不同的树的数量为:f[i-1]^K + 1
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for(;;)
{
int n = cin.nextInt();
int d = cin.nextInt();
if(n == 0 && d == 0)
break;
BigInteger[] f = new BigInteger[20];
f[0] = new BigInteger("1");
for(int i = 1; i <= d; i ++)
{
f[i] = new BigInteger("1");
for(int j = 0; j < n; j ++)
f[i] = f[i].multiply(f[i - 1]);
f[i] = f[i].add(BigInteger.ONE);
}
if(d == 0)
System.out.println(n + " " + d + " " + "1");
else
System.out.println(n + " " + d + " " + f[d].add(f[d - 1].negate()));
}
}
}