zoukankan      html  css  js  c++  java
  • zoj 3286 Very Simple Counting---统计[1,N]相同因子个数

    Very Simple Counting

    Time Limit: 1 Second      Memory Limit: 32768 KB

    Let f(n) be the number of factors of integer n.

    Your task is to count the number of i(1 <= i < n) that makes f(i) = f(n).

    Input

    One n per line (1 < n <= 1000000).

    There are 10000 lines at most.

    Output

    For each n, output counting result in one line.

    Sample Input

    4
    5

    Sample Output

    0
    2

    Hint

    f(1) = 1, f(2) = f(3) = f(5) = 2, f(4) = 3.


    Author: WU, Jun
    Source: ZOJ Monthly, December 2009

    理论依据:

    zoj的题目,对时间和空间的要求都很高。

    这一题,首先做的时候,超时。

    不看时间,不看数据,直接枚举,不超时是不可能。

    根据的公式和上一题福州大学oj那一题是一样的。

    贴一下超时代码吧,留个纪念。

     1 //超时代码
     2 
     3 #include<stdio.h>
     4 #include<stdlib.h>
     5 
     6 int f[1000003];
     7 int Num_Euler(int n)
     8 {
     9     int num=1,k,i;
    10     for(i=2;i*i<=n;i++)
    11     if(n%i==0)
    12     {
    13         k=1;
    14         while(n%i==0)
    15         {
    16             k++;
    17             n=n/i;
    18         }
    19         num=num*k;
    20     }
    21     if(n!=1)
    22     num=num*2;
    23     return num;
    24 }
    25 
    26 void make_ini()
    27 {
    28     int i;
    29     for(i=1;i<=1000000;i++)
    30     f[i]=Num_Euler(i);
    31 }
    32 int main()
    33 {
    34     int n,i,num;
    35     make_ini();
    36     while(scanf("%d",&n)>0)
    37     {
    38         num=0;
    39         for(i=1;i<n;i++)
    40         if(f[i]==f[n])
    41         num++;
    42         printf("%d
    ",num);
    43     }
    44     return 0;
    45 }

    后来想用筛选法来筛一次,然后求值。第一次写的时候,也错了。

    1 void make_NumEuler()
    2 {
    3     int i,j,k;
    4     for(i=1;i<=1000000;i++)
    5     opl[i]=1;
    6     for(i=1;i<=len;i++)
    7     for(j=prime[i],k=2;j<=1000000;j=j+prime[i],k++)
    8     opl[j]=opl[j]*k;
    9 }

    思路是有的,就是没有写出来,(⊙o⊙)…
    最后的代码:

     1 #include<iostream>
     2 #include<map>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 
     7 using namespace std;
     8 
     9 
    10 bool  s[1000003];
    11 int num[1000003];
    12 int ans[1000003];//个数
    13 int   f[1000003];
    14 map<int,int>Q;
    15 
    16 
    17 void make_ini()
    18 {
    19     int i,j,k;
    20     for(i=1;i<=1000000;i++)
    21     {
    22     num[i]=i;
    23     ans[i]=1;
    24     f[i]=0;
    25     }
    26     for(i=2;i<=1000000;i++)
    27     if(s[i]==false)//是素数
    28     {
    29         for(j=i;j<=1000000;j=j+i)//枚举每个素数的倍数
    30         {
    31            // if(j%i==0) //这个肯定成立,不需要
    32             {
    33                 k=1;
    34                 while(num[j]%i==0)
    35                 {
    36                     num[j]=num[j]/i;
    37                     k++;
    38                 }
    39                 ans[j]=ans[j]*k;
    40             }
    41             s[j]=true;
    42         }
    43     }
    44     for(i=1;i<=1000000;i++)
    45     {
    46         k=ans[i];
    47         if(Q.find(k)==Q.end())
    48         {
    49             Q[k]=1;
    50         }
    51         else Q[k]++;
    52         f[i]=Q[k];
    53     }
    54 }
    55 
    56 int main()
    57 {
    58     int n;
    59     make_ini();
    60    // Q.clear();
    61     while(scanf("%d",&n)>0)
    62     {
    63         printf("%d
    ",f[n]-1);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    arp攻击 (可查看同一局域网他人手机照片)
    SQL注入(转载)
    常见文件文件头文件尾格式总结及各类文件头
    CTF
    Base64,Base32,Base16进制的区别
    Maven学习总结(二):安装
    Maven学习总结(一):基本概念
    Myeclipse下集成SVN插件
    Windows下多个JDK版本之间的切换
    java线程的常用方法
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3250338.html
Copyright © 2011-2022 走看看