传送门


大意:求A^B的所有因子之和,并对其取模 9901再输出

(这题又调了半天,把n和项数弄混了QAQ)

根据算数基本定理:A=(p1^k1)*(p2^k2)*(p3^k3)*...*(pn^kn) (pi为素数)

则A的所有因子之和Sum=(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)

那么A^B = p1^(k1*B) * p2^(k2*B) * p3^(k3*B) *...* pn^(kn*B)

所以Sum=[1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...* [1+pn+pn^2+...+pn^(an*B)]

用分治求等比数列1+pi+pi^2+pi^3+...+pi^n:

(1)若n为奇数(有偶数项)则:
        1 + p + p^2 + p^3 +...+ p^n

  = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))

  = (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

(2)若n为偶数(有奇数项)则:
        1 + p + p^2 + p^3 +...+ p^n

  = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)

  = (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

可以递归求解

#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register int
#define ll long long
const int mod=;
using namespace std;
int a,b,tot,ans=;
int pm[],cnt[]; inline ll q_pow(ll a,ll p)
{
if(a==) return ;
R ret=; a%=mod;
for(;p;p>>=,(a*=a)%=mod) if(p&) (ret*=a)%=mod;
return ret;
} ll sum(ll a,ll c)
{
if(c==) return ;
if(c&) return ((+q_pow(a,(c>>)+))%mod*sum(a,(c>>))%mod)%mod;
return ((+q_pow(a,(c>>)+))%mod*sum(a,(c-)>>)+q_pow(a,c>>)%mod)%mod;
} int main()
{
scanf("%d%d",&a,&b);
for(R i=;i*i<=a;i+=(i&?:))
if(a%i==)
{
pm[++tot]=i;
while(a%i==) cnt[tot]++,a/=i;
}
if(a!=) pm[++tot]=a,cnt[tot]++;//要判断一下A本身是不是素数
for(R i=;i<=tot;i++) ans=(ans*(sum(pm[i],cnt[i]*b)%mod))%mod;
printf("%d\n",ans);
}

如有错误,恳请您指正(我太菜了);如有不理解,可留言,我会尽量回复。。。(高中生(逃)。。)

by Jackpei 2019.2.25

题解 poj1845 Sumdiv (数论) (分治)的更多相关文章

  1. POJ1845 sumdiv 数论

    正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...

  2. POJ1845 Sumdiv [数论,逆元]

    题目传送门 Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26041   Accepted: 6430 Des ...

  3. 【题解】Sumdiv

    [题解]Sumdiv 传送门 根据组合的乘法原理,一个数的所有约数和 \[ sum=\prod_{i=1} \Sigma_j^{a_i} p_i^j \] 所以任务就变成了分解\(A\)的质因数,分解 ...

  4. poj1845 Sumdiv

    poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...

  5. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  6. 【POJ 1845】Sumdiv——数论 质因数 + 分治 + 快速幂

    (题面来自luogu) 题目描述 输入两个正整数a和b,求a^b的所有因子之和.结果太大,只要输出它对9901的余数. 输入格式 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式 ...

  7. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

  8. POJ1845 Sumdiv 数学?逆元?

    当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...

  9. 【题解】localmaxima 数论

    # T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...

随机推荐

  1. js的内部类

    JavaScript中本身提供一些,可以直接使用的类,这种类就是内部类.主要有: Object/Array/Math/Boolean/String/RegExp/Date/Number共8个内部类. ...

  2. Go丨语言对MySQL数据库的增、删、改、查操作

    1.建立数据库名为: go_test_db 2.建表名为:userinfo 字段: uid int username varchar language varchar created varchar ...

  3. 【POJ 3580】SuperMemo Splay

    题意 给定$n$个数,$m$个询问,每次在$[L,R]$区间加上一个数,或者反转一个区间$[L,R]$,或者循环右移区间$[L,R]$共$T$次,或者在第$x$个数后插入一个数$p$,或者删除第$x$ ...

  4. python 之深浅拷贝

    浅拷贝: 深拷贝:

  5. P2762 [网络流24题]太空飞行计划问题(最小割)

    地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...

  6. HTML5设计原理

    HTML5是Web标准的巨大飞跃,它为什么要包含那些东西,它背后的设计原则是什么? <JavaScript DOM编程艺术>和<HTML5 For Web Designer>作 ...

  7. 推荐几个Laravel 后台管理系统

    小编推荐几个Laravel 后台管理系统 由百牛信息技术bainiu.ltd整理发布于博客园 一.不容错过的Laravel后台管理扩展包 —— Voyager 简介Voyager是一个你不容错过的La ...

  8. 微软开业网站----精华 http://www.microsoft.com/opensource/directory.aspx

    http://www.microsoft.com/opensource/directory.aspx

  9. java 对象锁和类锁的区别(转)

    java 对象锁和类锁的区别   转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...

  10. CF-845A

    A. Chess Tourney time limit per test 1 second memory limit per test 256 megabytes input standard inp ...