Oier们的幸运数字

题目描述

JerryC对数字痴迷到了一种非正常的境界。每天JerryC都有喜欢的一些数字。第 i i i 天JerryC就喜欢 A i − B i A_i-B_i AiBi中的数字。但是他觉得这样并不是很有趣,于是他就定义了一个函数
f ( i ) = i ∗ ∑ j = 1 i ( i   m o d   j ) f(i)=i*\sum^{i}_{j=1}(i\ mod\ j) f(i)=ij=1i(i mod j)
但是JerryC还是觉得不够有趣,于是她觉得只有满足
∑ i = A B f ( i ) \sum^{B}_{i=A}f(i) i=ABf(i)
为奇数的一天才是她特别高兴的一天。
现在告诉你最近 T T T天JerryC喜欢的数的区间,请你猜猜她每一天会不会特别高兴。
解释:
第一个式子就是表示 f ( i ) f(i) f(i) 等于 i i i 乘以 i i i 的约数个数。
第二个式子就是求出 [ A , B ] [A, B] [A,B] 区间内所有的 f ( i ) f(i) f(i) 的和。

输入输出格式

输入格式:
1 1 1行一个整数 T T T表示有多少天。
2 − ( T + 1 ) 2-(T+1) 2(T+1)行两个非负整数 A i ,   B i A_i,\ B_i Ai, Bi表示每天JerryC喜欢的数的区间。

输出格式:

T T T行。每行为" Y e s Yes Yes“或” N o No No",表示第 i i i 天是不是JerryC特别高兴的一天。

输入输出样例

输入样例:

3 3 3
1   10 1\ 10 1 10
11   15 11\ 15 11 15
5   12 5\ 12 5 12


#####输出样例:
N o No No
N o No No
Y e s Yes Yes

数据范围

0 < = T < = 1 0 6 ,   1 < = A i < = B i < = 1 0 18 0<=T<=10^6,\ 1<=A_i<=B_i<=10^{18} 0<=T<=106, 1<=Ai<=Bi<=1018

Solution \text{Solution} Solution

我们发现,只有 f ( c 2 ) ,   c f(c^2),\ c f(c2), c是奇数的情况才能对答案产生贡献。设 c = ⌈ a ⌉ ,   d = b c=\lceil\sqrt a\rceil,\ d=\sqrt b c=a , d=b
对于区间 [ a , b ] [a,b] [a,b],只有 [ c , d ] [c,d] [c,d]区间长度中的奇数对答案有贡献。我们求出 [ c , d ] [c,d] [c,d]区间长度便可以求出答案。

#include
#include
#include
#include

#define reg register

typedef long long ll;

int n,ans;
ll a,b;
ll c,d;
//读入优化
inline ll read(){
	ll x=0;char c;
	do c=getchar(); while(c<'0'||c>'9');
	while(c>='0'&&c<='9')
		x=x*10+c-48,c=getchar();
	return x;
}
int main(){
	scanf("%d",&n);
	for(reg int i=1;i<=n;++i){
		a=read(),b=read();
		c=ceil(sqrt(a)),d=sqrt(b);
		if(a==b)//特判
		{
			printf(c*c==a&&(c&1)?"Yes\n":"No\n");
			continue;
		}
		//如果c是偶数,他对答案不产生贡献
		if(!(c&1)) c++;
		printf(((d-c)/2+1)&1?"Yes\n":"No\n");
	}
}

你可能感兴趣的:(信息学,数学)