题目链接:https://vjudge.net/problem/LightOJ-1336#author=Amove
题意:求[1,n]之间的因子和函数为偶数的个数
思路:质因数分解后,约数之和为:
(p10+p11+…+p1c1)∗…∗(pk0+pk1+…+pkck)(p1^{0} + p1^{1} + … + p1^{c1}) * … * (pk^{0} + pk^{1} + …+ pk^{ck})(p10+p11+…+p1c1)∗…∗(pk0+pk1+…+pkck)
它是多个式子的乘积,考虑到只有奇数乘奇数结果会出现奇数。
然后我们考虑每个式子的奇偶性,当p为2时,式子一定时奇数,当p不为2时,只要有一个c为奇数,那么就会导致式子为偶数。根据此思路,我们发现可以写成2x∗i22^x*i^22x∗i2的数因子和函数为奇数,其他为偶数。
我们考虑正难则反,ans=n-{因子和函数为奇数的个数},将因子和函数为奇数的数分为两类,一类是2∗i22*i^22∗i2,一类是i2i^2i2
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
int cas=0;
while(t--)
{
ll n;
scanf("%lld",&n);
ll ans=0;
//O(sqrt(n))的思路:
// for(ll i=1;i<=n/i;i++)
// {
// ans++;
// if(2*i*i<=n) ans++;
// }
ans+=sqrt(n);ans+=sqrt(n/2);
printf("Case %d: %lld\n",++cas,n-ans);
}
}