首页 > 其他分享 >分治/质因数分解 POJ1845 求pow(a, b)的所有约数之和

分治/质因数分解 POJ1845 求pow(a, b)的所有约数之和

时间:2023-06-24 12:22:34浏览次数:46  
标签:约数 p1 因数分解 int pow sum long MOD

//POJ1845 求pow(a, b)的所有约数之和
//方法:1,分解质因数,将a分解成p1^ k1* p2^ k2^...*pn^ kn
//2, 那么pow(a, b)为p1 ^ (k1* b)* p2 ^ (k2* b)^...*pn ^ (kn* b)
//3,对于单独的pi ^ (ki * b),他所有的约数为(1, pi, pi ^ 2, pi ^ 3.....pi ^ (ki * b));
//4, 那么整个式子来说,pow(a, b)的所有约数和等于(1 + p1, p1 ^ 2, p1 ^ 3 + .....p1 ^ (ki * b))* (1 + p2, p2 ^ 2 + p2 ^ 3 + .....p2 ^ (ki * b))
//* (1 + pn + p1 ^ 2 + pn ^ 3 + .....p1 ^ (kn * b)),其中每个部分为等比数列
//5,先想到的是等比数列的求和公式,由于取模运算对于加减乘适用,但对于除法不适用,所以转换思路,才用分治法
//6,使用分治法求sum(p, c) = 1 + p ^ 2 + p ^ 3 + ... + p ^ c;
//如果c为奇数
//则1 + p + p ^ 2 + .... + p ^ c = 1 + p + .... + p ^ (c - 1) / 2+
//p^(c+1)/2+....+p^c
//= 1 + p + p ^ 2 + .... + p ^ c = 1 + p + .... + p ^ (c - 1) / 2+
//p^(c+1)/2*(1 + p + p ^ 2 + .... + p ^ c = 1 + p + .... + p ^ (c - 1) / 2)
//=(1+p^(c+1)/2)*sum(p,(c-1)/2)
//同理,当c为偶数时
//=(1+p^(c)/2)*sum(p^c/2-1)+p^c

#include<bits/stdc++.h>
using namespace std;
long long a, b;
int MOD = 9901;
int m;
int prime[100001], c[100001];
long long res;
//质因数分解
void divide(long long n)
{
m = 0;
for (int i = 2; i <= sqrt(n); i++)
{
if ((n % i) == 0)
{
prime[++m] = i, c[m] = 0;
}
while (n % i == 0)n /= i, c[m]++;
}
//n本身为质数
if (n > 1)prime[++m] = n,c[m]=1;
}

//快速幂
long long pow(long long a, long long b)
{
long long ans = 1;
while(b)
{

if(b&1)
ans = (a*ans)% MOD;
a = (a * a) % MOD;
b >> 1;
}
return ans;
}

long long sum(long long p,long long c)
{
if (c == 0 )return 1;
int ans = 0;
if (c & 1)return (1 + pow(p, (c + 1) / 2)) * sum(p, (c - 1) / 2)%MOD;
else return (1 + pow(p, c / 2))* sum(p, c / 2 - 1)%MOD + pow(p, c)%MOD;
}

int main()
{
cin >> a >> b;

divide(a);
res = 1;
for(int i=1;i<=m;i++)
{
res = res*sum(prime[i], c[i] * b)%MOD;
}

cout << res << endl;

}

标签:约数,p1,因数分解,int,pow,sum,long,MOD
From: https://www.cnblogs.com/xingxingli/p/17500905.html

相关文章

  • Python 求最大公约数
    题目要求求最大公约最简单快速的方式还是欧几里得算法原理:已知m、n两个不全为0的非负整数gcd(m,n)1:如果n=0,返回m作为结果,否则进入22:m对n取余,余数赋值给r3:将n赋值给m,r赋值给n,返回1参考实现defgcd(m,n):'''求最大公约数:paramm::paramn::ret......
  • Power BI - 占比问题
     ALL(表):整张表ALL(列):整张表中该列失去筛选作用;ALLSELECTED(表):筛选后的整张表ALLSELECTED(列):筛选后形成的一张表中,该列失去筛选作用; 计算占总体的比例DAX:总体占比=DIVIDE([销售金额],CALCULATE([销售金额],ALL('产品表'))) 计算占类别的比例D......
  • Power BI - HASONEVALUE函数
    返回值:是布尔值,True,False如果要判断的内容有多个值,不会报错,而是返回False。  ......
  • Linux Powershell 安装教程
    在微软爱上 Linux 之后,PowerShell 这个原本只是Windows才能使用的组件,于2016年8月18日开源并且成为跨平台软件:https://linux.cn/article-7699-1.html,登陆了Linux和macOS。PowerShell 是一个微软开发的自动化任务和配置管理系统。它基于.NET框架,由命令......
  • 题解 P4108【[HEOI2015]公约数数列】
    看到这种奇怪的操作,首先想到分块。以下记值域为\(w\),块长为\(B\)。前缀\(\gcd\)显然单调不增,而且后一个必须是前一个的因数,如果变化至少要减半。因此,我们知道,共有\(\mathcalO(\logw)\)个不同的前缀\(\gcd\)。我们可以接受对这些块暴力,只需要对前缀\(\gcd\)都相同的块......
  • debian11 安装powershell,powercli
    习惯了Linux,用不惯Windowssudoaptupdatesudoaptinstall-ycurlgnupgapt-transport-httpscurlhttps://packages.microsoft.com/keys/microsoft.asc|sudogpg--dearmor-o/etc/apt/trusted.gpg.d/microsoft.gpgsudoecho"deb[arch=amd64]https://packages.m......
  • 批量打印文件doc,设置几分,powershell实现
    $folderPath="C:\path\to\folder"$printCopies=3Get-ChildItem-Path$folderPath-Filter*.doc|ForEach-Object{for($i=0;$i-lt$printCopies;$i++){Start-Process-FilePath$_.FullName-VerbPrint}}#一定要指定默认打印机......
  • Windows下载更新powershell
    在使用windows系统默认的powershell时,打开使用的时候一般都会碰到以下这种情况,有新的版本可以尝试使用在powershell中使用命令:$PSVersionTable;可以查看到当前powershell的一些信息安装新版本powershellWindows官方powershell文档:https://aka.ms/pscore6Powershell7.1的官方Git......
  • windows ,go powershell 测试并且性能分析
    benchamark并且性能分析gotest-runnone-bench.-benchmem-cpuprofilecpu.prof-memprofilemem.prof;Start-Job{gotoolpprof-http=:10000.\cpu.prof};Start-Job{gotoolpprof-http=:10001.\mem.prof}-bench表示执行哪些基准测试函数,后面可以加需要执行......
  • #PowerBi Superchange PowerBi 序言部分笔记(2)
    Xmind本文思维导图序言部分,主要讲述了BI的分类及发展,以及作者推荐的学习方法。重点是介绍了powerbi的主要四大步骤。即:一:数据采集Dataacquisition:PowerBIhasapowerfuldataacquisitionenginethathelpsauserfetchandloadthedataneeded.Theunderlyingte......