zoukankan      html  css  js  c++  java
  • 约数之和

    分治:分治法把一个问题划分为若干个规模更小的同类子问题,对这些子问题递归求解,然后

    在回溯时通过它们推导出原问题的解

    首先把A分解质因数:A = p1 ^ k1 * p2 ^ k2 * ... * pn ^ kn

    然后A一共的约数个数是:

    (k1 + 1) * (k2 + 1) * ... * (kn + 1)

    然后A的所有约数之和是:

    (p1^0 + p1^1 + ... + p1^k1) * (p2^0 + p2^1 + ... + p2^k2) * ... * (pn^0 + pn^1 + ... + pn^kn)

    可以用分治的思想来求sum(p, k) = p^0 + p^1 + ... + p^k

    然后A ^ B = p1 ^ k1B * p2 ^ k2B * ... * pn ^ knB

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int mod = 9901;
     4 int qmi(int a, int k) {
     5     a %= mod;
     6     int res = 1;
     7     while (k) {
     8         if (k & 1) {
     9             res = res * a % mod;
    10         }
    11         a = a * a % mod;
    12         k >>= 1;
    13     }
    14     return res;
    15 }
    16 int sum(int p, int k) { //求p^0 + p^1 + ... + p^k的和
    17     if (k == 0) {
    18         return 1;
    19     }
    20     if ((k & 1) == 0) { //如果k是偶数
    21         return (p % mod * sum(p, k - 1) + 1) % mod;
    22         //return ((1 + qmi(p, k / 2)) % mod * sum(p, k / 2 - 1)) % mod + qmi(p, k) % mod;
    23     }
    24     //如果k是奇数
    25     return (1 + qmi(p, (k + 1) / 2)) * sum(p, (k - 1) / 2) % mod;
    26 }
    27 int main() {
    28     int A, B;
    29     cin >> A >> B;
    30     if (A == 0) { //特判
    31         cout << 0 << endl;
    32         return 0;
    33     }
    34     int res = 1;
    35     for (int i = 2; i <= A; i++) { //对A分解质因数
    36         int s = 0;
    37         while (A % i == 0) {
    38             s++;
    39             A /= i;
    40         }
    41         if (s) {
    42             res = res * sum(i, s * B) % mod;
    43         }
    44     }
    45     cout << res << endl;
    46     return 0;
    47 }
  • 相关阅读:
    Vue内置指令
    Vue计算属性
    Ubuntu下编译Bilibili/ijkplayer
    自毁程序
    Android最大可运行内存
    Android ListView onItemClick Not Work
    Java/Android 二进制数据与String互转
    JAVA/Android Map与String的转换方法
    java中打印变量地址
    Win7 关闭Window update
  • 原文地址:https://www.cnblogs.com/fx1998/p/13910399.html
Copyright © 2011-2022 走看看