zoukankan      html  css  js  c++  java
  • Sumdiv 数论提 (数学很重要),这道题中算法变成了次要因素,数学才是最重要的,注意其中的一个经典公式(求因数和的)(很好推导)

    Problem Description
    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).
     
    Input
    The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.
     
    Output
    The only line of the output will contain S modulo 9901.
     
    Sample Input
    2 3
     
    Sample Output
    15
    ***************************************************************************************************************************
    S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn);S表示约数的个数,这个式子很好推,稍微想一想就明白啦,(注意p是质数,这就是一个因数和的分解因式,可以还原试一试)(说明数学很重要啊!!)
    ***************************************************************************************************************************
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<math.h>
     4 
     5 #define SIZE_N 10000
     6 #define MODE 9901
     7 using namespace std;
     8 typedef __int64 llg;
     9 
    10 int prime[SIZE_N],cnt[SIZE_N];
    11 
    12 
    13 int My_power(llg n,int m)//求一个q^n的幂值
    14 {
    15     llg ans = 1;
    16     while(m) {
    17         if(m & 1) {
    18             ans = (ans * n) % MODE;
    19         }
    20         n = (n * n) % MODE;
    21         m >>= 1;
    22     }
    23     return ((ans == 0) ? MODE : ans);
    24 }
    25 
    26 llg Sum_gp(llg p, llg n)//求和的幂值
    27 {
    28     if(n == 0) return 1;
    29     if(n & 1)
    30         return ((1+My_power(p, n/2+1)) * Sum_gp(p, n/2)) % MODE;
    31     else
    32         return ((1+My_power(p, n/2+1)) * Sum_gp(p, n/2-1) + My_power(p, n/2)) % MODE;
    33 }
    34 
    35 
    36 
    37 int Sumdiv(int a,int b)
    38 {
    39     int i,j,xz;
    40     int ans = 1;
    41 
    42     xz = sqrt(a);
    43     for(i = 2,j = 0;i < xz;i ++) {
    44         if(a % i == 0) {
    45             prime[j] = i;
    46             while(a % i == 0) {
    47                 cnt[j] ++;
    48                 a /= i;
    49             }
    50             j ++;
    51         }
    52     }
    53     if(a != 1) {
    54         prime[j] = a;
    55         cnt[j++] = 1;
    56     }
    57     for(i = 0;i < j;i ++) {
    58         ans = (ans * Sum_gp(prime[i],cnt[i]*b)) % MODE;
    59     }
    60     return ans;
    61 }
    62 
    63 int main()
    64 {
    65     int a,b;
    66     int ans;
    67 
    68     while(scanf("%d%d",&a,&b) != EOF) {
    69         ans = Sumdiv(a,b);
    70         printf("%d
    ",ans);
    71     }
    72     return 0;
    73 }
    View Code
  • 相关阅读:
    多线程系列教材 (四)- 常见的线程安全相关的面试题
    多线程系列教材 (三)- Java 多线程同步 synchronized 详解
    多线程系列教材 (二)- Java 常见的线程方法
    UPC-最优分解问题(贪心)
    【数论】【模板】
    UPC-人品指数(模拟)
    UPC-趾压板矩阵(强行找规律)
    UPC-排队出发+AcWing-耍杂技的牛(推公式的贪心)
    UPC-购买巧克力(贪心)
    前端——多行三列模式页面布局
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3383124.html
Copyright © 2011-2022 走看看