链接:LightOJ - 1336 Sigma Function
题意:
σ(x)表示
x的所有因数之和,给出
n(1≤n≤1012),问
1 ~
n中有多少数的
σ值是偶数?
分析:
根据唯一分解定理,有
x=p1a1⋅p2a2⋯pkak
则
σ(x)=(1+p1+p12+⋯+p1a1)(1+p2+p22+⋯+p2a2)⋯(1+pk+pk2+⋯+pkak)
由于 奇数
×奇数
=奇数
,偶数
×奇数
=偶数,所以我们可以 讨论
σ(x)为奇数的情况,即 所有乘数均为奇数 的情况。
当
p=2时,可以发现,无论
a是多少,
(1+p+p2+⋯+pa)都一定为奇数;
而当
p̸=2时(则质因数
p一定是奇数),可以发现,仅当
a为偶数的时候,
(1+p+p2+⋯+pa)为奇数,否则为偶数。
然后,我们可以对质因数
2的指数
a进行讨论,若
a是偶数,因为其他质因数的
a也是偶数,所以这个数满足
k2
若
a是奇数,同理,因为其他质因数的
a是偶数,则这个数满足
2∗k2
所以,我们只需要找到上述两种数的个数:
-
n以内满足
k2的个数:
n
(因为
1 ~
n
的所有数平方后都在
n以内)
-
n以内满足
2∗k2的个数:
2n
(因为
1 ~
2n
的所有数平方后乘以
2都在
n以内)
则最终答案为
ans=n−n
−2n
以下代码:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--)
{
LL n,ans;
scanf("%lld",&n);
ans=n-(LL)sqrt(n)-(LL)sqrt(n/2);
printf("Case %d: %lld\n",++kase,ans);
}
return 0;
}