zoukankan      html  css  js  c++  java
  • 七夕节(筛法思想)

    Description

     

    七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:

    数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6. 你想知道你的另一半吗?Input

    输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).

     对于每组测试数据,请输出一个代表输入数据N的另一半的编号.

    Sample Input

    3
    2
    10
    20

    Sample Output

    1
    8
    22


    解题思路:题目要求所给数的所有因子之和。这道题如果针对每一个数都将其拆分成一个个的因子,必然会造成时间超时,要解决这个问题,我们需要考虑找每个数的因子有没有什么共性的方法,这样就可以通过打表实现了!是有的,每个数可能会很大,但其因子必然会小于其本身,而它的因子还有可能是其他数的因子,那么我们直接去枚举因子边可以了。而因子该怎么分配给含有该因子的数呢?是该因子的倍数的那些数必然含有该因子!我们直接分配给它的倍数就可以了,这里其实也是筛法的一种应用,代码和筛法求素数有点像。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define MAX 500010
     5 using namespace std;
     6 int a[MAX];
     7 void getsum()
     8 {
     9     int i,j;
    10     for(i=1;i<=MAX;i++)
    11     {
    12         for(j=i*2;j<MAX;j+=i)
    13         {
    14             a[j]=a[j]+i;
    15         }
    16     }
    17 }
    18 int main()
    19 {
    20     int t,n;
    21     scanf("%d",&t);
    22     getsum();
    23     while(t--)
    24     {
    25         scanf("%d",&n);
    26         printf("%d
    ",a[n]);
    27     }
    28     return 0;
    29 }



  • 相关阅读:
    个人作业—软件评测
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—某次疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    寒假规划作业(1/2)
    【图像处理】利用双线性插值算法进行图像的缩放
    只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果
    js中运算符优先级问题
    微信、QQ中app的下载问题
    浅述html5和web app
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9915591.html
Copyright © 2011-2022 走看看