题意:f(n)为n所有约数的和,给你一个数n,让你求从1到n中f(n)为偶数的数有多少个.
思路:n=p1^e1*p2^e2...,则f(n)=(p1^(e1+1)-1)/(p1-1))*(p2^(e2+1)-1)/(p2-1))....
且(p1^(e1+1)-1)/(p1-1))=p1^0+p1^1......+p1^e1;
要使得f(n)为奇数,则(p1^(e1+1)-1)/(p1-1)到(pn^(en+1)-1)/(pn-1)都要为奇数;
1:当p为2时,2^n-1肯定为奇数。
2:当p为非2的素数时,p一定为奇数,那么为了使(p1^(e1+1)-1)/(p1-1)为奇数,我们需要使得e为偶数。
那么我们只需要统计1到n中的平方数个数和2倍的平方数的个数,得到的为1到n中f(n)为奇数的个数。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t;
int cas=1;
ll n;scanf("%lld",&t);
while(t--)
{
ll ans=0;
scanf("%lld",&n);
for(ll i=1;i*i<=n;i++)
{
ans++;
if(2*i*i<=n)
{
if(2*i*i==72||i*i==72) printf("%d\n",i);
ans++;
}
}
printf("Case %d: %lld\n",cas++,n-ans);
}
return 0;
}