题目链接:http://acdream.info/problem?pid=1669
Problem Description
数一有一个偶像,他叫高斯,没错,就是那个不用循环语句就会计算1+2+3+...+100的小学生,数一对高斯简直是盲目的崇拜,最喜欢的定理是高斯定理,最喜欢的函数是高斯函数,当然高斯发明了很多很多函数,也有很多很多定理,但是数一最爱的是f(x)=[x],其中[x]表示不超过x的最大整数,例如[3]=3,[2.8]=2,[-2.8]=-3,那么现在问题来了,数一想计算:
但是他不希望你用循环语句,所以邪恶的他会让n变得很大很大~~~当然结果S也会很大很大,大数神马的最讨厌了,所以你只需要告诉他S是奇数还是偶数就行了~
Input
多组数据,每组一个整数n。(n不超过50位)
Output
对于每组数据,如果S是奇数,输出1,否则输出0,即输出S%2.
Sample Input
1 2 3
Sample Output
1 1 1
Hint
数据组数不多,可以试试随机输出~反正每组50%几率答对~~~
Source
mathlover
打表找规律,然后发现是大数开方。。。
代码:
package test;
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
BigInteger remain=BigInteger.ZERO;
BigInteger odd=BigInteger.ZERO;
BigInteger ans=BigInteger.ZERO;
while(cin.hasNext())
{
String s=cin.next();
remain=BigInteger.ZERO;
odd=BigInteger.ZERO;
ans=BigInteger.ZERO;
int group=0,k=0;
if(s.length()%2==1)
{
group=s.charAt(0)-'0';
k=-1;
}
else
{
group=(s.charAt(0)-'0')*10+s.charAt(1)-'0';
k=0;
}
for(int j=0;j<(s.length()+1)/2;j++)
{
if(j!=0)
group=(s.charAt(j*2+k)-'0')*10+s.charAt(j*2+k+1)-'0';
odd=BigInteger.valueOf(20).multiply(ans).add(BigInteger.ONE);
remain=BigInteger.valueOf(100).multiply(remain).add(BigInteger.valueOf(group));
int count=0;
while(remain.compareTo(odd)>=0)
{
count++;
remain=remain.subtract(odd);
odd=odd.add(BigInteger.valueOf(2));
}
ans=ans.multiply(BigInteger.TEN).add(BigInteger.valueOf(count));
}
BigInteger tmp = ans.mod(BigInteger.valueOf(2));
if(tmp.compareTo(BigInteger.valueOf(1)) == 0)
System.out.println("1");
else
System.out.println("0");
}
}
}