题解 poj1845 Sumdiv (数论) (分治)
大意:求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 (数论) (分治)的更多相关文章
- POJ1845 sumdiv 数论
正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...
- POJ1845 Sumdiv [数论,逆元]
题目传送门 Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 26041 Accepted: 6430 Des ...
- 【题解】Sumdiv
[题解]Sumdiv 传送门 根据组合的乘法原理,一个数的所有约数和 \[ sum=\prod_{i=1} \Sigma_j^{a_i} p_i^j \] 所以任务就变成了分解\(A\)的质因数,分解 ...
- poj1845 Sumdiv
poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...
- 【题解】POJ1845 Sumdiv(乘法逆元+约数和)
POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...
- 【POJ 1845】Sumdiv——数论 质因数 + 分治 + 快速幂
(题面来自luogu) 题目描述 输入两个正整数a和b,求a^b的所有因子之和.结果太大,只要输出它对9901的余数. 输入格式 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式 ...
- 约数之和(POJ1845 Sumdiv)
最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- 【题解】localmaxima 数论
# T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...
随机推荐
- matlab程序计时
t1=datetime(); %程序 t2=datetime() totaltime=t2-t1; disp(t2-t1); 或者: tic %代码块 toc disp(['运行时间: ',num2s ...
- not in和not exist的区别(转)
in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...
- [acm]HDOJ 3082 Simplify The Circuit
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3082 字符串处理+并联电阻公式 //11481261 2014-08-18 16:52:47 Acc ...
- python 多模块文件共享变量
Python import 包的机制是,import进来的和默认的系统的module了,都放在sys.module这个字典里面. 多个py文件再次import的时候,会先去sys.module里面检查 ...
- [Codeforces 452E] Three Strings
[题目链接] https://codeforces.com/contest/452/problem/E [算法] 构建后缀数组 用并查集合并答案即可 时间复杂度 : O(NlogN) [代码] #in ...
- 【Python】numpy 数组拼接、分割
摘自https://docs.scipy.org 1.The Basics 1.1 numpy 数组基础 NumPy’s array class is called ndarray. ndarray. ...
- JZOJ 1667【AHOI2009】中国象棋——dp
题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...
- linux 中spfvim安装
1. 安装 git 1.1 安装依赖的包: curl curl-devel zlib-devel openssl-devel perl c ...
- Poj_1068 Parencodings
S (((( )( )() ) ) ) P-sequence 4 5 6666,表示第i个右括号的左边有几个左括号. W-sequence 1 1 1456,表示第i个右括号和以 ...
- algo: 冒泡排序(Java实现)
package com.liuxian.algo; public class MySortClass implements Comparable<MySortClass> { public ...