解题报告 和谐
1. 题目
和谐
harmony.pas/c/cpp
【问题描述】
小k同学本来想给这个题套一个很好玩的背景的,但是因为一些原因(看题目名,你们懂的),这题的题面就变得非常无聊了。
对于任意四个两两不同的数,记,考虑以下6个值:,在这6个值中sum的约数个数记为这四个数的和谐度。例如0,7,2,3这4个数的和谐度为2.因为0+2和0+3是这4个数的和12的约数。
现在小k想知道两个问题:1. 如果他任意写下4个数,和谐度最大可能是多少;2. 满足并且A、B、C、D这4个数的和谐度为第1问中的值的所有四元组一共有多少组。
【输入格式】
输入一行2个整数L和R,意义如上所述。
【输出格式】
输出2行,每行一个整数,分别表示2问的答案。
【样例输入】
harmony.in
1 30
【样例输出】
harmony.out
4
3
【样例解释】
和谐度最大只能达到4,没有和谐度超过4的4个数
在[1, 30]中,满足和谐度为4的4个数共有3组:
1. 1 5 7 11
2. 2 10 14 22
3. 1 11 19 29
【数据规模和约定】
对于60%的数据,;
对于100%的数据,.
2. 题目实质
告诉你一个秘密,这是 IMO(国际数奥)2011 的第一题。
3. 算法
和谐度最大只能达到4,没有和谐度超过4的4个数 -----把第一问答案就这么告你了......
暴搜后,可以发现规律(需要证明的 google 一下 IMO),满足条件的只有两种情况:k,5k,7k,11k k,11k,19k,29k
然后,写就行了。
4. 注意事项
用公式求,不要枚举 ans (不过相信大家也没有我这么......),不然会超时。
5. 代码
小公式(SueMiller)
var ll,rr,t,ans:int64;
begin
assign(input,'harmony.in');reset(input);
assign(output,'harmony.out');rewrite(output);
readln(ll,rr);
if ll>rr then begin
writeln(4);
writeln(0);
close(input);close(output);
halt;
end;
writeln(4);
ans:=(rr div 29-ll+1)+(rr div 11-ll+1);
if ans<0 then ans:=0;
writeln(ans);
close(input);close(output);
end.