Oier们的幸运数字

题目描述

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

输入输出格式

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

输出格式:

TT行。每行为"YesYes“或”NoNo",表示第 ii 天是不是JerryC特别高兴的一天。

输入输出样例

输入样例:

33
1 101\ 10
11 1511\ 15
5 125\ 12


#####输出样例:
NoNo
NoNo
YesYes

数据范围

0<=T<=106, 1<=Ai<=Bi<=10180<=T<=10^6,\ 1<=A_i<=B_i<=10^{18}

Solution\text{Solution}

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

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>

#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");
	}
}
posted @ 2018-08-26 15:01  TeacherDai  阅读(111)  评论(0)    收藏  举报