• hdu1215 七夕节---因子和


    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1215

    题目大意:

    求N的因子和(不包括N本身)

    解题思路:

    模板传送门

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 #include<map>
     9 #include<sstream>
    10 #define Mem(a, b) memset(a, b, sizeof(a))
    11 using namespace std;
    12 typedef long long ll;
    13 const int INF = 1e9 + 7;
    14 const int maxn = 1000000+10;
    15 int prime[maxn];
    16 bool is_prime[maxn];
    17 int sieve(int n)//返回n以内素数的个数
    18 {
    19     int p = 0;
    20     for(int i = 0; i <= n; i++)is_prime[i] = 1;
    21     is_prime[0] = is_prime[1] = 0;
    22     for(ll i = 2; i <= n; i++)
    23     {
    24         if(is_prime[i])
    25         {
    26             prime[p++] = i;
    27             for(ll j = i * i; j <= n; j += i)is_prime[j] = 0;//这里涉及i*i,必须使用long long
    28         }
    29     }
    30     return p;
    31 }
    32 
    33 ll Divisors_num(ll n, int tot)//素数总数
    34 {
    35     ll ans = 1;
    36     for(int i = 0; i < tot && prime[i] * prime[i] <= n; i++)
    37     {
    38         if(n % prime[i] == 0)
    39         {
    40             int cnt = 0;
    41             while(n % prime[i] == 0)
    42             {
    43                 cnt++;
    44                 n /= prime[i];
    45             }
    46             ans *= (cnt + 1);
    47         }
    48     }
    49     if(n > 1)ans *= 2;
    50     return ans;
    51 }
    52 ll pow(ll a, ll b)
    53 {
    54     ll ans = 1;
    55     while(b)
    56     {
    57         if(b & 1)ans = ans * a;
    58         a *= a;
    59         b /= 2;
    60     }
    61     return ans;
    62 }
    63 ll Divisors_sum(ll n, int tot)
    64 {
    65     ll ans = 1;
    66     for(int i = 0; i < tot && prime[i] * prime[i] <= n; i++)
    67     {
    68         if(n % prime[i] == 0)
    69         {
    70             int cnt = 0;
    71             while(n % prime[i] == 0)
    72             {
    73                 cnt++;
    74                 n /= prime[i];
    75             }
    76             ans = (pow(prime[i], cnt + 1) - 1) / (prime[i] - 1) * ans;
    77         }
    78     }
    79     if(n > 1)ans *= (n + 1);
    80     return ans;
    81 }
    82 int main()
    83 {
    84     int T, cases = 0;
    85     int tot = sieve(1000000);
    86     cin >> T;
    87     while(T--)
    88     {
    89         ll n;
    90         scanf("%lld", &n);
    91         printf("%lld
    ", Divisors_sum(n, tot) - n);
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    OA常见问题和解决方案
    如何用Visio画venn(维恩)图
    小谈SQL表的连接
    记一次视图的应用
    常用sql语句备份
    EF中关系映射问题
    .net core 2.0的一次奇特经历
    .net core 下的Area注册
    win 10+ iis 10 部署.net core 1.1 web api
    AutoMapper差异内容备份
  • 原文地址:https://www.cnblogs.com/fzl194/p/9017507.html
Copyright © 2020-2023  润新知