Home_W的简单问题3
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:%lld
给你两个整数a,b。问a,b之间的所有的整数(包括a,b)的因子和是奇数还是偶数
比如a=1,b=3, 1的因数有 1。2的因数有1,2。3的因数有1,3.。
1+1+2+1+3=8. 所以1,3之间的所有整数的因子和是偶数。1510154017949071413.jpg
查看废话:注意这题有一个很简单的逻辑坑
现在把这坑悄悄的告诉你,a不一定小于b
Input
第一行是一个T,代表数据的组数
接下来有T组数据。
每组数据第一行是两个整数a,b
T<=50000
1<=a,b<=500000
其实这题本来想把数据范围出到1e18的,但那样新生就死翘翘了
Output
输出0代表是偶数,输出1代表是奇数,每个输出结果占一行
SampleInput
2
1 3
1 500000
SampleOutput
0
1
看到这题呢,暴力显然过不去,第一个想法是预处理优化,结果博主太二了,只顾着做了,把预处理优化忘了,先T了一发,cin cout改成scanf printf 后还是T 然后才意识到没预处理。。
这题需要稍微分析下,
首先分奇偶,
(1)如果是奇数,奇数的因子都是奇数,那么有几个奇数呢,我们想到了完全平方数,如果是完全平发数,那么一定有奇数个奇数因子,因子和一定是奇数,比如25 因子有1 5 25,和是31,如果不是完全平方数,比如21 1 21 3 7,因为总有一个数跟他配对,这个数的因子和就是偶数。
(2)如果是偶数, 就看/2的因子和是不是奇数,如果是,那么因子和就是奇数,比如50,/2等于25,50的因子有1 50 2 25 5 10,其中1 25 5是25的因子,因子和是奇数,而剩下50 2 10的和是偶数,如果/2不是完全平方数,那么因子和就是偶数了。
这里再说下偶数的话为什么/2的因子和是奇数的话,这个数因子和一定是奇数,这个数的因子一定有/2后这个数的所有因子,奇+偶=奇,因此……
下面是代码,切记预处理,,,
#include<bits/stdc++.h>
using namespace std;
int s[500005]= {0},qq[500005]={0};
int main()
{
int t,i,q,k,m;
for(i=1; i<=500000; i++)
{
q=i;
if(q&1)
{
q=sqrt(q);
if(q*q==i) s[i]=1;
else s[i]=0;
}
else
{
k=q/2;
if(s[k]==1) s[i]=1;
else s[i]=0;
}
qq[i]=s[i]+qq[i-1];///表示前i个数中因子和是奇数的个数
}
scanf("%d",&t);
while(t--)
{
int a,b,c,d,sum=0;
scanf("%d%d",&a,&b);
c=max(a,b),d=min(a,b);
sum=qq[c]-qq[d-1];///类似前缀和
if(sum&1)
puts("1");
else
puts("0");
}
}