首页 > 其他分享 >[lnsyoj509/AcWing99]约数之和

[lnsyoj509/AcWing99]约数之和

时间:2024-06-15 22:45:35浏览次数:15  
标签:约数 include AcWing99 int ans lnsyoj509 prod mod

题意

原题链接
求\(A^B\)的约数之和\(\bmod 9901\)

sol

\(x\)的约数之和\(f(x)\)可以通过以下公式计算
根据算数基本定理,将\(x\)分解为$$\prod_{i=1}^k a_i^{p_i}$$
则$$f(x)=\prod_{i=1}^k \sum_{j=0}^{p_i} a_i^j = \prod_{i=1}^k \frac{a_i^{p_i+1} - 1}{a_i - 1}$$

证明

根据算数基本定理,将\(x\)分解为\(\prod_{i=1}^k a_i^{p_i}\)
易知\(a_i^{p_i}\)的所有约数为\(a_i^0,a_i^1,a_i^2,...,a_i^{p_i}\),共\(p_i+1\)个,每一个\(a_i^{p_i}\)的约数中选择一项并相乘,可以构成\(x\)的所有约数,因此,\(x\)的约数之和即为每一个\(a_i^{p_i}\)的所有约数之和的积。显然,\(a_i^{p_i}\)的值为等比数列,它们的和为\(\frac{a_i^{p_i+1} - 1}{a_i - 1}\),所以\(x\)的约数之和为\(\prod_{i=1}^k \frac{a_i^{p_i+1} - 1}{a_i - 1}\),即得证

至于分解\(A^B\),可以先对\(A\)进行质因数分解,则

\[A^B = (\prod_{i=1}^k a_i^{p_i})^B = \prod_{i=1}^k a_i^{p_i \cdot B} \]

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;

const int mod = 9901;

vector<PII> primes;
int a, b;

void div(int x){
    for (int i = 2; i <= x / i; i ++ ){
        if (x % i == 0){
            int cnt = 0;
            while (x % i == 0){
                x /= i;
                cnt ++ ;
            }
            primes.push_back({i, cnt});
        }
    }
    if (x != 1) primes.push_back({x, 1});
}

int qpow(int a, int k){
    int ans = 1;
    while (k){
        if (k & 1) ans = (long long) ans * a % mod;
        a = (long long) a * a % mod;
        k >>= 1;
    }
    return ans;
}

int main(){
    scanf("%d%d", &a, &b);
    div(a);
    long long ans = 1;
    for (auto p : primes){
        int m = qpow(p.x - 1, mod - 2); //计算逆元
        ans = ans * (qpow(p.x, p.y * b + 1) - 1) % mod * m % mod;
    }

    printf("%lld\n", ans);

    return 0;
}

标签:约数,include,AcWing99,int,ans,lnsyoj509,prod,mod
From: https://www.cnblogs.com/XiaoJuRuoUP/p/18249887/lnsyoj509_AcWing99

相关文章

  • [lnsyoj98/luoguP1403]约数研究
    题意原题链接求\(1\simn\)的约数个数和sol直接算很困难,考虑换一个角度求\(1\simn\)的约数个数和,等价于求\(1\simn\)分别是范围内几个数的约数对于第\(i\)个值,在\(1\simn\)中,存在\(i,2\cdoti,3\cdoti,\cdots,k\cdoti\),共\(\lfloor\frac{n}{i}\rfloor\)因此,最终......
  • 最大公约数(gcd())和最小公倍数(lcm())的c语言和c++详细解法
    最大公约数(gcd())和最小公倍数(lcm())最大公约数:定义:两个或多个整数共有的约数中最大的一个。例如:整数12和18,他们的公约数有1、2、3、6,其中最大的公约数是6。c语言解法:辗转相除法和更相减损法1、辗转相除法:思路:先求解较大的数除以较小的数的余数,再用较小的数除以前......
  • 【每日一算法】所有元素的 最大值 和 最大公约数 相等
    题目描述Silencer76 定义一个序列是好序列,当且仅当序列中所有元素的最大值和最大公约数相等。给定一个长度为 n的正整数序列 a,请找出最长的符合好序列定义的子序列,输出它的长度。输入描述:输出描述:示例一输入512321输出2示例说明:根据题意,子序......
  • C++:最小公倍数与最大公约数
    最大公约数(GreatestCommonDivisor,GCD)最小公倍数(LeastCommonMultiple,LCM)#include<iostream>//函数:计算两个数的最大公约数(GCD),这被称为欧几里得算法intgcd(inta,intb){if(b==0)returna;returngcd(b,a%b);}//函数:计算两个数的......
  • P1734 最大约数和
    变形01背包#include<bits/stdc++.h>usingnamespacestd;constintN=1010;ints;intn,m;intv[N],w[N],f[N];intaccum(intp){//预先处理约数之和 intans=0; for(inti=1;i<=p-1;i++){//因为不包括它本身因此p-1;if(p%i==0)ans+=i; ......
  • 赛克oj 1541(线性筛、约数个数)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)题目描述小明在学校学了质数和合数的知识后,便想知道对于任意的一个数N,将其拆分为一个质数与一个合数相加的结果,有几种拆法?但后来想想又觉得太简单了,于是他追加了一些条件,合数要继续拆分为两个数相乘的形式才行,那么满足以上......
  • C语言---最大公约数和最小公倍数的求法
    #include<stdio.h>//欧几里得算法求的最大公约数intgcd(inta,intb){//一定要确保a>bif(a<b){inttemp=a;a=b;b=temp;//作用是创建临时变量将a和b的数值置换}while(b!=0)//当b不等于0时,继续执行循环......
  • CSP历年复赛题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • 判断两个数的最大公约数
    ​常见点击查看代码#include<bits/stdc++.h>usingnamespacestd;intgcd(inta,intb){returnb?gcd(b,a%b):a;}intmain(){inta,b,c;while(1){cout<<"输入两个数字求最大公约数"<<endl;cin>>a>>b;......
  • 约数个数和
    首先这个约数公式要记住,具体见这篇题解然后剩下的就是比较简单的套路操作了,最后会化出来\[\sum_{d=1}^{min(n,m)}\sum_{d|x}\sum_{d|y}\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rflooru(d)=\sum_{d=1}^{min(n,m)}u(d)(\sum_{d|x}\lfloor\frac{n}{x}\rfloor)(\sum_{d|y}\lf......