这道题实在是有些精彩
求 1- n 内因子和为偶数的数字的 个数
那么我们就有思路了虽然题目里给了求因子和公式
但是由于之前我们自学,我们知道这个公式最原始的样子
Sum = (1 + p1^1 + p1^2 + ... pn^a1) * .........
题目里给的全是等比数列求和公式优化后的式子
首先我们需要了解一个东西, 偶数个奇数相加之和是偶数,奇数个奇数相加之和是奇数。。
证明的话可能比较。。粗糙:
我们知道两个奇数之和必定为 偶数了,那么如果偶数个相加不就是。。多个两个奇数相加吗。。而偶数加偶数必定是奇数,奇数加偶数必定是偶数,,,所以如果是奇数个奇数相加,我们拿出一个奇数,剩下的是偶数个奇数相加 为偶数,最后加上这个奇数,最终结果就是 奇数了。
那么这条规律我们先暂时放下,但是记住。
我们发现对于乘法而言 奇数乘以奇数才为奇数(奇数个奇数相加),我们知道素数里 只有 2 是偶数,而对于前 n 项和公式,我们知道 2 那一部分必定为 奇数(化简到最后为 2^n - 1) 所以可以知道 2^x 这些数字因子和必为奇数
对于公式 X = p1^a1 * p2^a2 *..... pn^an
那么对于其他项, Sum = S(p1) + S(p2) + S(p3),..... p2 p3 ----pn 都必定为 奇数同时我们知道 p^n 也一定为奇数(奇数乘以奇数仍为奇数)那么 对于每个素数 p 一共有 a+1个奇数相加 ,如果 S 想为奇数, a+1 必定得是奇数,得出 a 必定得为 偶数
那么如果 a 为偶数,那么我们知道这个数必定可以由 p2^2(或者 (p2^2) ^ 2 ) 作为因子,也就是平方数因子和必定为奇数
但是别忘了 如果 p1 = 2 的时候也得算上,所以任意的平方数 * 2 因子和也是奇数
这样我们可以不用去管 2^k 因为 2^k 可以分解成 2* 某个平方数。
综上 最终结果就是 n - sqrt( n ) - sqrt( n/2 )
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
ll n;
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
ll a = sqrt(n);
ll b = sqrt(n/2);
printf("Case %d: %lld\n",cas++,n-a-b);
}
return 0;
}