传送门:http://poj.org/problem?id=1845

大致题意:

求A^B的所有约数(即因子)之和,并对其取模 9901再输出。

解题基础:

1) 整数的唯一分解定理

任意正整数都有且只有一种方式写出其素因子的乘积表达式。

,其中为素数

2) 约数和公式

对于已经分解的整数,A的所有因子之和为

3) 同余模公式

(a+b)%m=(a%m+b%m)%m

(a*b)%m=(a%m*b%m)%m

1: 对A进行素因子分解

这里如果先进行筛50000内的素数会爆空间,只能用最朴素的方法进行分解

2:A^B的所有约数之和为

3: 求2中的等比序列

由于给的数据量大,肯定不能直接用等比序列的求和公式,要用分治法进行求解

一直对递归求解

S的下标为偶数类比一下

4:反复平方法计算幂次式

一个快速幂取模的板子,直接套上

#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
int p[10000];
int q[10000];
const int mod = 9901;
//快速幂取模板子
long long qucick_pow(int m, int n, int moD)
{
if(n == 0)
return 1;
long long x = qucick_pow(m, n / 2, moD);
long long ans = x * x % mod;
if(n % 2)
ans = ans * m % mod;
return ans;
}
// 递归求解等比数列
long long sum(int m, int n)
{
if(n == 0)
return 1;
if(n % 2)
{
return (sum(m, n / 2) * (1 + qucick_pow(m, n / 2 + 1, mod))) % mod;
}
else
{
return (sum(m, n / 2 - 1) * (1 + qucick_pow(m, n / 2 + 1, mod)) + qucick_pow(m, n / 2, mod)) % mod;
}
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int cnt = 0;
for(int i=2;i*i<=a;)
{
if(a%i==0)
{
p[cnt]=i;
while(a%i==0)
{
a/=i;
q[cnt]++;
}
cnt++;
}
if(i==2)
i+=1;
else
i+=2;
}
if(a!=1)
p[cnt]=a,q[cnt++]=1;
long long ans = 1;
for(int i = 0; i < cnt; i++)
{
ans = (ans * (sum(p[i], q[i] * b) % mod)) % mod;
}
cout << ans % mod << endl;
}

POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]的更多相关文章

  1. POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩阵快速幂取模)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20309   Accepted:  ...

  2. 快速幂取模(POJ 1995)

    http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c ...

  3. HDU--杭电--4506--小明系列故事——师兄帮帮忙--快速幂取模

    小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  4. 【转】C语言快速幂取模算法小结

    (转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...

  5. HDU 1061 Rightmost Digit --- 快速幂取模

    HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...

  6. UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!

    题意: 斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0) 输入a.b.n,求f(ab)%n 分析: 构造一个新数列F(i) = f(i) ...

  7. POJ3641-Pseudoprime numbers(快速幂取模)

    题目大意 判断一个数是否是伪素数 题解 赤果果的快速幂取模.... 代码: #include<iostream> #include<cmath> using namespace ...

  8. 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模

    题目地址:http://ac.jobdu.com/problem.php?pid=1085 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k). ...

  9. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模

    很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...

随机推荐

  1. 在执行 php artisan key:generate ,报 Could not open input file: artisan 错误

    Could not open input file: artisan 必须保证命令是在项目根目录,如下图所示:

  2. c++ opencv显示对话框

    IplImage *pl = cvLoadImage("e:\\3.bmp", 1); cvNamedWindow("123", 1); cvShowImage ...

  3. mysql行级锁和表级锁的区别

    表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低:行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高:

  4. Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX

    Redis获取缓存异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX. 出现这种异常,我需要自 ...

  5. 201809-2 买菜 Java

    思路: 顺序读入,例如:小H装车的时间段为[1,3],小W装车的时间段为[2,4],重叠部分为[2,3],记在数组times[2]中.最后输出时判断数组times中值大于1的(其实就是2),即为重叠部 ...

  6. (5)opencv的基础操作和矩阵的掩模操作

    不懂的,可以简单,看看这个网址:https://blog.csdn.net/xiongwen_li/article/details/78503491 图片放到了桌面,所以,图片的路径就是桌面了,剩余的 ...

  7. spring boot2 运行环境

    1.springboot个版本系统需求 spring boot maven jdk 内置tomcat 内置jetty servlet 2.0.x 3.2+ 8或9 8.5(3.1) 9.4(3.1) ...

  8. mac安装浏览器同步测试工具

    1.安装node.js (1)打开终端,输入以下命令安装Homebrew ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebre ...

  9. 面向对象变成(OOP)-创建类和使用类

    1.1.1对象的抽象:抽象是一种归纳或总结,对象是现实世界物体特征的实例. (1)一切皆是对象. (2)类是对象的抽象. 1.1.2 对象的使用: 当对象被抽象为类以后,就可以创建具体的实例来操作了. ...

  10. Java多线程之并发包,并发队列

    目录 1 并发包 1.1同步容器类 1.1.1Vector与ArrayList区别 1.1.2HasTable与HasMap 1.1.3 synchronizedMap 1.1.4 Concurren ...