Sumdiv(各种数学)
http://poj.org/problem?id=1845
题意:求A^B的所有约数的和再对9901取模;
做了这个学到了N多数学知识;
一:任意一个整数都可以唯一分解成素因子的乘积;A = p1^k1*p2^k2*......*pn^kn;
A先对2不断取模,当A%2==0时,2的次数加1,直到A%2!=0,A再尝试着对3不断取模.....依次进行下去,直到A = 1;
当A本身就是素数时,A^1就是素数本身的分解式(特殊情况,别忘了加判断);
这样A^B = p1^(k1*B) * p2(k2*B) * .......*pn^(kn*B);
二:一个数用素因子乘积表示后其约数和公式;
A = p1^k1*p2^k2*......*pn^kn;
则 素因子和 sum = (1+p1+p1^2+p1^3+......+p1^k1) * (1+p2+p2^2+p2^3......p2^k2) * ......*(1+pn+pn^1+pn^2+pn^3+.....pn^kn);
三:用二分递归求等比数列前n项和;
求1+ p+p^2+p^3+.......+p^n
若n是奇数,共有偶数项,sum = (1+p+p^2+....+p^n/2)*(1+p^(n/2+1));
若n是偶数,共有奇数项,sum = (1+p+p^2+.....+p^(n/2-1))*(1+p^(n/2+1))+p^n/2;
四:反复平方法求p^n;
ans = 1;
while(n>0)
{
if(n是奇数) ans = ans*p;
n = n/2;
p = p*p;
}
ans = p^n;
#include<stdio.h>
#include<string.h>
#include<math.h>
const int N = ;
const int mod = ;
int p[N];
int n[N];
int A,B; //将A分解成素因子的积,A = p[0]^n[0]+p[1]^n[1]+....+p[k-1 ]^n[k-1];
int Div(int A)
{
int k = ,i;
for(i = ; i*i <= A;)
{
if(A%i == )
{
n[k] = ;
p[k] = i;
while(!(A%i))
{
n[k]++;
A/=i;
}
k++;
}
if(i == )
i++;
else i += ;
}
if(A != )
{
p[k] = A;
n[k++] = ;
}
return k;
} long long power(long long p,long long n)//用反复平方法计算p^n;
{
long long sq = ;
while(n>)
{
if(n&)
sq = (sq*p)%mod;//若n是奇数,把p乘到sq;
n = n/;
p = p*p%mod;
}
return sq;
} long long cal(long long p,long long n)//用反复平方法计算1+p+p^2+....p^n;
{
if(n == )
return ;
if(n&)//如果n是奇数
return (cal(p,n/)*(+power(p,n/+)))%mod;
else return (cal(p,n/-)*(+power(p,n/+))+ power(p,n/))%mod;
} int main()
{
while(~scanf("%d %d",&A,&B))
{
int k,i,sum;
k = Div(A); sum = ;
for(i = ; i < k; i++)
{
sum = (sum*(cal(p[i],n[i]*B)%mod))%mod;
}
printf("%d\n",sum);
}
return ;
}
Sumdiv(各种数学)的更多相关文章
- POJ 1845 Sumdiv (数学,乘法逆元)
题意: 给出数字A和B,要求AB的所有因子(包括AB和1)之和 mod 9901 的结果. 思路: 即使知道公式也得推算一阵子. 很容易知道,先把分解得到,那么得到,那么的所有因子之和的表达式如下: ...
- 『sumdiv 数学推导 分治』
sumdiv(POJ 1845) Description 给定两个自然数A和B,S为A^B的所有正整数约数和,编程输出S mod 9901的结果. Input Format 只有一行,两个用空格隔开的 ...
- poj 1845 POJ 1845 Sumdiv 数学模板
筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- Sumdiv(快速幂+约数和)
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16244 Accepted: 4044 Description C ...
- Sumdiv 等比数列求和
Sumdiv Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15364 Accepted: 3790 De ...
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- ACM数学知识体系
在盛情收到学弟邀请给他们整理ACM数学方面的知识体系,作为学长非常认真的弄了好久,希望各学弟不辜负学长厚爱!!!非常抱歉因为电脑全盘格式化好多word.PPT都丢失,我尽量具体地给大家找到各知识点学习 ...
- B - Sumdiv(第三周)
B - Sumdiv 题目链接:https://vjudge.net/contest/154063#problem/B 题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题思路 ...
随机推荐
- Jboss image upload and http access to show image--reference
question I am uploading images to jboss server by getting the absolute path using the following code ...
- Android自定义Notification并没有那么简单
背景 最近需要实现一个自定义Notification的功能.网上找了找代码,解决方案就是通过RemoteViews来实现.但是在实现过程中遇到不少问题,网上也没有很好的文章描述这些问题,所以在这里做个 ...
- 2进制,16进制,BCD,ascii,序列化对象相互转换
public final static char[] BToA = "0123456789abcdef".toCharArray() ; 1.16进制字符串转为字节数组 /** * ...
- ASP.NET 微信支付
一.在支付前期,我们需要获取用户的OpenId,此块内容只针对于JSAPI(微信中直接支付)才需要,如果生成二维码(NATIVE)扫描支付,请跳过此步骤 思路大致是:获取用户的code值 > 根 ...
- C#重载重写
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字.override:过载也称重写是指子类对父类中虚函数或抽象函数的“覆盖 ...
- What and where are the stack and heap?
The stack is the memory set aside as scratch space for a thread of execution. When a function is cal ...
- iOS中MVVM的架构设计与团队协作
对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架,之前用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人 ...
- zoj 3209.Treasure Map(DLX精确覆盖)
直接精确覆盖 开始逐行添加超时了,换成了单点添加 #include <iostream> #include <cstring> #include <cstdio> ...
- iOS图片的伪裁剪(改变图片的像素值)
0x00 原理 利用一张图片事先画好的图片(以下称为蒙板),盖在要被裁剪的的图片上,然后遍历蒙板上的像素点,修改被裁剪图片对应位置的像素的色值即可得到一些我们想要的不规则图片了(比如人脸) 0x01 ...
- PHPCMS 使用图示和PHPCMS二次开发教程(转)
PHPCMS V9 核心文件说明 模块与控制器 模块: phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块.即url访问中的m. 访问content模块示 ...