题意:

  给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果。

思路:

  即使知道公式也得推算一阵子。

  很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下:

  

  我们要做的就是计算出sum%9901的结果。

  有两种方法:

  (1)直接用快速幂计算对上面sum的第一步推算求结果,在计算过程中顺便取模。

  (2)可以根据以下这条公式对上面sum的第二步推算求结果:

     

    也是需要用到快速幂,过程也稍微复杂了些。注意 mb 可能会超过int。

  以下是第二种方法的代码:

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
const LL mod=;
bool isPrime[N];
LL p[N]; //素数表 int get_all_prime(int n) //筛法求所有[0~n)素数,返回素数表大小
{
memset(isPrime, , sizeof(isPrime));
int cnt=;
for(int i=; i<n; i++)
{
if(!isPrime[i]) continue;
p[cnt++]=i;
for(int j=i*i; j<n; j+=i) isPrime[j]=;
}
return cnt;
} LL _mul(LL a,LL b,LL mod) //a*b要用加法形式运算才不会溢出
{
a%=mod;
LL r=; //结果
while( b )
{
if( b& ) r=(r+a)%mod;
a=(a+a)%mod;
b>>=;
}
return r;
} LL pow(LL a,LL b,LL mod) //快速幂函取模
{
a%=mod;
LL r=; //结果
while( b )
{
if( b& ) r=_mul(r,a,mod);
a=_mul(a,a,mod);
b>>=;
}
return r;
} LL cal(LL A,LL B)
{
LL ans=;
for(int i=; p[i]*p[i]<=A; i++ ) //先求A的所有质因子
{
if(A%p[i]==)
{
int cnt=;
while(A%p[i]==) //全部取光
{
cnt++;
A/=p[i];
}
LL mb=mod*(p[i]-);
ans*=(pow(p[i], cnt*B+, mb)+mb-)%mb/(p[i]-) ; //要防止出现负数
ans%=mod;
}
} if(A>)
{
//如果没有把A成功分解,那么必定是个质数。
//其实也可以写在上面那一步中,只是复杂度就会稍高了。
LL mb=mod*(A-);
ans*=(pow(A, B+, mb)+mb-)%mb/(A-) ; //要防止出现负数
ans%=mod;
} return ans;
} int main()
{
//freopen("input.txt", "r", stdin);
get_all_prime(N);
int A, B;
while(~scanf("%d%d",&A,&B))
printf("%lld\n", cal(A,B) );
return ;
}

AC代码

POJ 1845 Sumdiv (数学,乘法逆元)的更多相关文章

  1. poj 1845 POJ 1845 Sumdiv 数学模板

    筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...

  2. POJ 1845 Sumdiv 【二分 || 逆元】

    任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...

  3. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

  4. poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】

    POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...

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

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

  6. POJ 1845 Sumdiv(因子分解+快速幂+二分求和)

    题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...

  7. POJ 1845 Sumdiv (整数拆分+等比快速求和)

    当我们拆分完数据以后, A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...*[1+pn+pn^2 ...

  8. POJ1845 Sumdiv 数学?逆元?

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

  9. poj 1845 Sumdiv (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

随机推荐

  1. java之二叉树--未完待续

    参考http://how2j.cn/k/collection/collection-tree/476.html#nowhere 二叉树概念 二叉树由各种节点组成二叉树特点:每个节点都可以有左子节点,右 ...

  2. POJ 3255 Roadblocks (次短路)

    题意:给定一个图,求一条1-n的次短路. 析:次短路就是最短路再长一点呗,我们可以和求最短路一样,再多维护一个数组,来记录次短路. 代码如下: #pragma comment(linker, &quo ...

  3. LIS与LCS的nlogn解法

    LIS(nlogn) #include<iostream> #include<cstdio> using namespace std; ; int a[maxn]; int n ...

  4. 天梯赛L2-006. 树的遍历L3-010. 是否完全二叉搜索树

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  5. Oracle SQL调优之分区表

    目录 一.分区表简介 二.分区表优势 三.分区表分类 3.1 范围分区 3.2 列表分区 3.3 散列分区 3.4 组合分区 四.分区相关操作 五.分区相关查询 附录:分区表索引失效的操作 一.分区表 ...

  6. PHP中GD库是做什么用的? PHP GD库介绍11111111

    什么是gd库?    gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据 ...

  7. lightoj1009【DFS】

    思路: 连通快+二分图,每次+二分图大的元素个数. #include<bits/stdc++.h> using namespace std; typedef unsigned long l ...

  8. zoj2901【DP·二进制优化】

    题意: 要排一个L长度的序列,当 j 放在 i 后面的时候会增加v[ i ][ j ]的值,求构成L长度序列的最大值. 思路: 可以想到预处理任意两点<i,j>的最大值是多少,然后题目还有 ...

  9. spring-eureka 源码解读----作为集群的eureka怎么样实现不做二次传播

    在平时工作中,eureka作为一个集群时候,我们会配置多个peer ,假设当前有服务器eureka-A,eureka-B,eureka-C. 如果Eureka A的peer指向了B, B的peer指向 ...

  10. uoj#351. 新年的叶子(概率期望)

    传送门 数学还是太差了,想了半天都没想出来 首先有一个定理,如果直径(这里考虑经过的点数)为奇数,所有直径有同一个中点,如果直径为偶数,所有直径有同一条最中间的边.这个可以用反证法,假设不成立的话直径 ...