【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)
题目:
POJ1845
分析:
首先用线性筛把\(A\)分解质因数,得到:
\]
则显然\(A^B\)分解质因数后为
\]
接下来隆重推出约数和定理:(证明见【知识总结】约数个数定理和约数和定理及其证明)
\]
那么很明显可以对于每一个\(p_i\)计算\(p_i^0+p_i^1...+p_1^{a_iB}\)然后乘起来就是答案。这就是一个等比数列求和了。
等比数列求和公式中含有除法,所以取模求和的时候不能直接用求和公式,否则如果除数刚好是模数的倍数就会出现逆元不存在的尴尬情况……例如POJ该题讨论区中的数据\(59407 \ 1\) (\(59407=9901*6+1\),求和公式中除数是\(59406\),此数在模\(9901\)意义下没有逆元)
这里介绍一种二分等比数列求和的方法,思路和快速幂相似,即代码中的\(powersum\)函数
可以把这个等比数列平分成长度相等的两部分。
当\(n\)是偶数
\]
然后从后半部分提出一个\(p_i^{n/2+1}\),它就和偶数部分一样了!得到
\]
显然左边可以递归地算下去,右边用快速幂求出。
当\(n\)是奇数,只要上述\(n/2\)均向下取整,算完以后加上\(p_i^n\)就可以了。这个也可以用快速幂解决。
代码:
\(powersum\)函数求的是\(\sum_{j=1}^{a_i}p_i^j\),所以最后统计答案的时候要手动加上\(p_i^0\) (也就是\(1\))
筛质数时有一个小技巧。并不需要筛出\(5e7\)范围内的所有质数。x不可能含有两个或以上大于\(\sqrt x\)的质因数,所以\(x\)除以\(\sqrt{5e7}\)范围内的所有质数后如果仍不为\(1\),那么此时剩下的\(x\)一定是一个质数
我才不会告诉你模数叫QQ_kotori是为了膜某位n姓QQ小嘴/复读机
#include <iostream>
using namespace std;
namespace zyt
{
typedef long long ll;
const int QQ_kotori = 9901;
const int M = 7100;
ll prime[M], index[M];
int cnt;
void init_prime(ll x)
{
static bool mark[M];
for (int i = 2; i < M && x > 1; i++)
{
if (!mark[i])
{
ll tmp = 0;
prime[cnt] = i;
while (x % i == 0)
tmp++, x /= i;
index[cnt++] = tmp;
}
for (int j = 0; j < cnt && i * prime[j] < M; j++)
{
ll k = i * prime[j];
mark[k] = true;
if (i % prime[j] == 0)
break;
}
}
if (x > 1)
{
prime[cnt] = x;
index[cnt++] = 1;
}
}
ll power(ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b % 2)
ans = ans * a % QQ_kotori;
a = a * a % QQ_kotori;
b /= 2;
}
return ans;
}
ll powersum(ll a, ll b)
{
if (b == 1)
return a % QQ_kotori;
ll ans = powersum(a, b / 2) * (1 + power(a, b / 2)) % QQ_kotori;
if(b % 2)
ans = (ans + power(a, b)) % QQ_kotori;
return ans;
}
void work()
{
ll a, b, ans = 1;
cin >> a >> b;
if (a == 0)
{
cout << 0;
return;
}
else if (b == 0)
{
cout << 1;
return;
}
init_prime(a);
for (int i = 0; i < cnt; i++)
if (index[i])
ans = ans * (powersum(prime[i], index[i] * b) + 1) % QQ_kotori;
cout << ans;
}
}
int main()
{
zyt::work();
return 0;
}
【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)的更多相关文章
- HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)
题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路: 设A = |(1, 1),(1, 0) ...
- POJ1845 Sumdiv [数论,逆元]
题目传送门 Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 26041 Accepted: 6430 Des ...
- POJ1845 sumdiv 数论
正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...
- 题解 poj1845 Sumdiv (数论) (分治)
传送门 大意:求A^B的所有因子之和,并对其取模 9901再输出 (这题又调了半天,把n和项数弄混了QAQ) 根据算数基本定理:A=(p1^k1)*(p2^k2)*(p3^k3)*...*(pn^kn ...
- 等比数列二分求和(logn复杂度)
看完这个之后,感觉数学简直太厉害了 转载自:http://blog.csdn.net/acdreamers/article/details/7851144 今天我们学习如何有效地求表达式的值.对于这个 ...
- poj 1845 Sumdiv 约数和定理
Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...
- 【FZYZOJ】数论课堂 题解(约数个数定理)
前言:想了两个小时orz,最后才想到要用约数个数定理…… ------------- 题目大意: 给定$n,q,A[1],A[2],A[3]$ 现有$A[i]=(A[i-1]+A[i-2]+A[i-3 ...
- poj1845 Sumdiv
poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...
- poj 1845 Sumdiv (数论)
题目链接 题意:求 A^B的所有约数之和对9901取模后的结果. 分析: 看了小优的博客写的. 分析来自 http://blog.csdn.net/lyy289065406/article/detai ...
随机推荐
- OpenCV+Python识别车牌和字符分割的实现
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
- 匹配 C 语言样式字符串
#include <stdio.h> char haha[] = "nihaoma" "niubi" "\"hello worl ...
- maven使用nexus3.3在windows下搭建私服
1. 私服简介 私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则 ...
- zoj 3812 状压dp
转载:http://blog.csdn.net/qian99/article/details/39138329 题意:给出n个物品,每个物品有两种属性Wi,Ti,有q组查询,每组查询要求在n个物品中选 ...
- [bzoj3131]淘金[sdoi2013][数位DP]
求出每个数i可以被转移到的数目$f[i]$,则点$(i,j)$中的金子数目为$f[i]*f[j]$,我们就可以用优先队列求解前$k$大. 首先所有的积数目在$10^4$左右,可以先Dfs搜索出所有的数 ...
- BZOJ2521 最小生成树 最小割
5.26 T2:最小生成树 Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法 ...
- Springmvc 一个简单的管理系统 我所遇到的坑1(持续更新)
前言 好久没有用springmvc写项目了,抽时间写一个简单的springmvc项目 是什么(what)为什么(why)怎么做(how) 1.读书破万卷下笔如有神(理清思路,知识储备和前期整理) 2. ...
- Ubuntu 16.04安装XMind 8
下载: http://www.xmind.net/download/linux/ 解压 sudo unzip xmind-8-update2-linux.zip -d xmind8 移动到/opt目录 ...
- AE 创建
using System; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF; usi ...
- HDU 5358 多校第6场 First One
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...