题目
平方差
时间限制: 1.0 s 内存限制: 256.0 M B
要求:求出满足以下条件的X的个数
给定,
,
,
和
为任意不相等的自然数,求出有多少个
满足
,
解题思路
首先因式分解
四种情况:
1、当y为奇数,z为奇数时:
为偶数
为偶数
偶数相乘,最小的因数为2,相乘最小因数为4,所以x在此情况下一定为4的倍数
2、当y为奇数,z为偶数时:
为奇数
为奇数
奇数相乘,一定为奇数
3、当y为偶数,z为奇数时:
为奇数
为奇数
奇数相乘,一定为奇数
4、当y为偶数,z为偶数时:
为偶数
为偶数
偶数相乘,最小的因数为2,相乘最小因数为4,所以此情况下一定为4的倍数
四种情况分出了两种结果,一种是奇数,另一种是4的倍数
所以我们需要找的是奇数,以及4的倍数。
因为题目有要求1s,且数据可能为,数据量比较大,所以我们就按着数学上的公式去推导一下偶数的个数:
又是4种情况,归纳一下变成,LR 都为奇数,LR一奇一偶,LR都为偶数
LR 都为奇数
偶数的个数为 (L+R)/2
LR一奇一偶
偶数的个数为(L+R+1)/2
LR都为偶数
偶数的个数为(L+R)/2+1
然后找4的倍数
偶数中4的倍数有几个取决于偶数的个数是奇数还是偶数
把总数减去偶数中不是4的倍数的个数就是我们呢得到的满足条件的个数
若偶数的个数为偶数则有一半为4的倍数,即满足条件的个数为:(R-L+1)-((even-1)/2);
若偶数的个数为奇数则需要判断单边是否为4的倍数,若为4的倍数则满足条件的个数为:(R-L+1)-((even-1)/2); 不为4的倍数则(R-L+1)-((even+1)/2);
printf("请输入L:");
scanf("%d",&L);
printf("请输入R:");
scanf("%d",&R);
time_start = clock();
if(L%2==0)
{
L_Even=1;
L_Odd=0;
}
else
{
L_Even=0;
L_Odd=1;
}
if(R%2==0)
{
R_Even=1;
R_Odd=0;
}
else
{
R_Even=0;
R_Odd=1;
}
if(L_Odd&&R_Odd)//双奇
{
even =((R-L)/2);
}
else if(L_Odd||R_Odd) //单奇
{
even =(R-L+1)/2;
}
else{ //双偶
even =(R-L)/2+1;
}
if(even%2==0)//偶数个数为偶数
{
i = (R-L+1)-(even/2);
}
else
{
if((L+1)%4==0)
{
i = (R-L+1)-((even-1)/2);
}
else
{
i = (R-L+1)-((even+1)/2);
}
}
time_end = clock();
printf("L是%d,R是%d偶数个数是%d,满足条件的个数为%d\n",L,R,even,i);
printf("运行时间为%dms\n",time_start-time_end);
运行结果