zoukankan      html  css  js  c++  java
  • 约数之和(两种方法)

    image

    也可以直接用等比树列求和公式,乘上逆元

    分治:

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstring>
      4 using namespace std;
      5 
      6 using ll = long long;
      7 const int Mod = 9901;
      8 int ksm(int a, int n){
      9     int res = 1;
     10     while(n){
     11         if(n&1) res = (res%Mod * a % Mod) % Mod;
     12         a = a % Mod * a % Mod;
     13         n >>= 1;
     14     }
     15     return res;
     16 }
     17 
     18 int sum(int p, int n){
     19     if(n == 0) return 1;
     20     if(n&1) return ((1 + ksm(p, (n+1)/2)) % Mod * sum(p, (n-1)/2)%Mod ) % Mod;
     21     else return ((1 + ksm(p, n/2))% Mod * sum(p, n/2 - 1)%Mod * ksm(p, n) % Mod)% Mod;
     22 }
     23 
     24 int main(){
     25     int A, B;
     26     int ans = 0;
     27     cin >> A >> B;
     28     for(int i = 2; i <= A; ++ i){
     29         int res = 0;
     30         while(A % i == 0)res++, A /= i;
     31         if(res) ans = (ans % Mod * sum(i, res * B) % Mod)%Mod;
     32     }
     33     cout << ans << endl;
     34     return 0;
     35 }

    等比数列求和+逆元:

      1 /*
      2 Sn = (anq - a1)/(q-1)
      3 由本题知q = i;
      4 由于有n+1项;
      5 Sn+1 = (an+1q - a1)/(q-1)
      6 因为an = a1q^(n-1)
      7  8 Sn+1 = (a1q^(n+1) - a1)/(q-1);
      9 在由费马小定理
     10 除以一个数并取模,等于乘上这个树得逆元,在取模;
     11 求逆元用快速幂
     12 ksm(x, Mod - 1)
     13 */
     14 
     15 #include <iostream>
     16 #include <algorithm>
     17 #include <cstring>
     18 using namespace std;
     19 const int Mod = 9901;
     20 using LL = long long;
     21 LL ksm(LL a, LL n){
     22     LL res = 1;
     23     while(n){
     24         if(n&1) res = (res%Mod * a%Mod)%Mod;
     25         a = (a%Mod * a%Mod) % Mod;
     26         n >>= 1;
     27     }
     28     return res;
     29 }
     30 
     31 int main(){
     32     LL A, B;
     33     cin >> A >> B;
     34     LL res = 1;
     35     if(A == 0) res = 0;
     36     for(int i = 2; i <= A; ++ i){
     37     if(A % i == 0){
     38         LL s = 0;
     39         while(A % i == 0){
     40             s ++;
     41             A /= i;
     42         }
     43 
     44         LL x = i % Mod;
     45         if(i % Mod == 1)//避免出现为零的情况余数为1的时候逆元为零,不满足条件
     46             res = res*(B*s + 1) % Mod;
     47         else res = (res % Mod * (ksm(x, s * B + 1)-1) % Mod * ksm(x - 1, Mod - 2) %Mod) %Mod;
     48 
     49         }
     50     }
     51     cout  << res << endl;
     52     return 0;
     53 }
    追求吾之所爱
  • 相关阅读:
    java.util.concurrent学习
    mysql慢查优化总结
    mysql怎么限制某些查询语句的执行?
    数据库操作提交事务如果不关闭,会有什么样的后果?
    apache的500错误是写到哪个文件里面
    apache也可以做负载均衡,跟nignx的区别是什么?
    ajax提交请求为啥url要用这个函数encodeURI
    MySQL性能调优与架构设计读书笔记
    java枚举的作用
    linux的命令
  • 原文地址:https://www.cnblogs.com/rstz/p/12686907.html
Copyright © 2011-2022 走看看