题目大意:
给你一个 n ,求出 1 到 n 中有多少个数的因数和为偶数。
解题思路:
可以先求出因数和为奇数的数字的个数。
由算术基本定理我们可以得到:N=P1a1P2a2P3a3 … Pnan, σ(N) = (1+p1+p12+ … +p1a1)(1+p2+p22+ … +p2a2) … (1+pn+pn2+ … +pnan). 其中各个 p 均为素数。
我们先考虑那些因数中没有 2 的数。由于 σ(N) 为奇数,那么对于式中相乘的各项应该都是奇数,一个显而易见的事实是:除了 2 以外其他的素数均为奇数。我们随意取出一项:(1+pi+pi2+ … +piai),不难发现一个结论:如果 ai 为偶数,那么这一项的和为奇数;否则为偶数。于是我们可以大胆地推测 σ(N) 中各个非2质因数的指数均为偶数,那么这些数均为平方数,我们只需去掉 1 到 n 中的所有平方数,即可去掉那些因数中没有 2 而且因数和为奇数的数。
如果考虑因数中有 2 的数呢?其实只需在上面求出各个平方数时顺便再乘一下 2 即可。
AC代码:
1 #include<stdio.h> 2 #include<math.h> 3 typedef long long ll; 4 int main(){ 5 int t; 6 ll n; 7 scanf("%d",&t); 8 for(int j=1;j<=t;j++){ 9 scanf("%lld",&n); 10 ll ans=n; 11 for(ll i=1;i*i<=n;i++){ 12 ans--; 13 if(2*i*i<=n) ans--; 14 } 15 printf("Case %d: %lld ",j,ans); 16 } 17 return 0; 18 }