51nod-1837-砝码称重

来源:互联网 发布:linux卸载光盘命令 编辑:程序博客网 时间:2024/05/02 01:30

题目描述

小 Q 有 n 个砝码,它们的质量分别为 1 克、 2 克、……、 n 克。

他给 i 克的砝码标上了编号 i (i = 1, 2, …, n),但是编号被人打乱了,即编号为 i 的砝码不一定是 i 克,而是 a_i 克,这里 a 指的是 1 到 n 的一个排列。

他有一杆天平,可以向天平的两侧放任意数量的砝码,通过一次称量得到两侧质量的大小关系,关系只有左侧重、一样重、右侧重三种可能。

他想知道,最坏情况下,他至少需要称量多少次,才能确定其中至少一个编号为 i 的砝码的质量是 i 克或不是 i 克。

提示:这里所谓的最坏情况是指,对于固定的、按顺序进行的称量操作,不论每次称量的结果是什么,都能完成所需完成的上述判定任务。

例如 n = 6 时,可以只称量一次,选择编号为 1、 2、 3 的砝码放在左侧,编号为 6 的砝码放在右侧。

如果天平不是平的,则可以确定存在至少一个砝码 i 不是 i 克 (i = 1, 2, 3, 6),否则编号为 6 的砝码一定是 6 克。

再例如 n = 5 时,可以只称量两次,第一次选择编号为 2、3 的砝码放在左侧,编号为 5 的砝码放在右侧,第二次选择编号为 1、4 的砝码放在左侧,编号为 5 的砝码放在右侧。

这里略去这样称量的正确性,留给做题人推导和证明。

Input

输入包含多组测试数据。
每行对应一组测试数据,包含一个正整数 n 。
不超过 10^5 组数据,1 ≤ n ≤ 10^9。

Output

每行对应一组测试数据,输出一个正整数表示答案。

样例

input

1
5
6

output

0
2
1

题解

51nod小透明突然秒了这道题超开心der ‘ㅅ’
这道题差不多就是一道找规律题 ‘ㅅ’
高斯曾经证明过 每一个正整数可以表示为3个三角形数的和
证明过程没在网上找到 想请大大帮忙证明quq
然后我们就可以发现 答案肯定是<=2的
于是分这几种情况
1、当n=1,ans=0;
2、当n为三角形数,ans=1;
3、当n为三角形数+1,ans=1;
4、当第n个三角形数为完全平方数,ans=1;
5、当第n个三角形数为完全平方数+1,ans=1;
6、其他情况ans=2;

然后贴代码quq

var n,k1,k2:longint;begin  while not eof do  begin    readln(n);    k1:=trunc(sqrt(2*n));    k2:=trunc(sqrt(2*n-2));    if n=1 then writeln(0)    else if k1*(k1+1)=2*n then writeln(1)    else if k2*(k2+1)=2*n-2 then writeln(1)    else if sqr(trunc(sqrt(n*(n+1) div 2)))=n*(n+1) div 2 then writeln(1)    else if sqr(trunc(sqrt(n*(n+1) div 2-1)))=n*(n+1) div 2-1 then writeln(1)    else writeln(2);  end;end.
原创粉丝点击