LightOJ1336

 

题目大意:

  给你一个 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\n",j,ans);
16     }
17     return 0;
18 }

 

posted @ 2017-10-21 22:04  Blogggggg  阅读(272)  评论(0编辑  收藏  举报