求A^B的所有约数和 POJ1845
2015-08-13 09:52
274 查看
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; long long arr1[100000]; long long MOD=9901; long long multi(long long a,long long b) { if(b==0) return 1; if(b==1) return a; long long ret=multi(a,b/2); ret=(ret*ret)%MOD; if(b&1) ret=ret*a%MOD; return ret; } long long fsum(long long p,long long n) //递归二分求 (1 + p + p^2 + p^3 +...+ p^n)%mod { //奇数二分式 (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1)) if(n==0) //偶数二分式 (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2) return 1; if(n%2) //n为奇数, return (fsum(p,n/2)*(1+multi(p,n/2+1)))%MOD; else //n为偶数 return (fsum(p,n/2-1)*(1+multi(p,n/2+1))+multi(p,n/2))%MOD; } int main() { long long a,b; while(scanf("%I64d%I64d",&a,&b)!=EOF) { memset(arr1,0,sizeof(arr1)); long long sum=a; long long ans1=1; double s=sqrt((double)a); int num=0; for(int i=2;i<=s;i++) { int flag=0; while(sum%i==0) { sum=sum/i; flag++; arr1[num]=i; } if(flag) { flag*=b; num++; ans1=(ans1*fsum(arr1[num-1],flag))%MOD; // cout<<arr1[num-1]<<" "<<flag<<endl; // cout<<ans1<<endl; } } if(sum!=1) { arr1[num]=sum; ans1=(ans1*fsum(sum,b))%MOD; num++; } cout<<ans1<<endl; } return 0; }
View Code
求一个数的所有约数和
ans=(1+q1^1+q1^2+......+q1^k1)*(1+q2^1+q2^2+......+q2^k2)*......(1+qn^1+qn^2+......qn^kn)
此题不能用等比数列前n项和,因为要求逆元需要该数与MOD互质,而此题中MOD过小,该数可能为MOD的整数倍,所以要用二分的方法直接求
(1+p+p^2+p^3)=(1+p)*(1+p^2)
相关文章推荐
- java 后台开发关键词解释
- A题之NowCoder数列
- 自定义leftBarButtonItem的右滑回退功能首页右滑界面卡死解决
- Win10系统下Genymotion无法打开该怎么办?
- swift -变量的定义与使用
- MFC自动获取网络地址函数实现----广播地址,网关,子网掩码
- CSU 1004 Xi and Bo
- 九度 Online Judge 算法 刷题 题目1013:开门人和关门人
- C++中各种类型修饰符汇总
- 照片教你eclipse通过使用gradle 打包Android
- [LeetCode] Binary Tree Right Side View
- POJ-3009 Curling 2.0 (DFS)
- 递归无限极分类
- WAS生成的文件:javacore.***.txt 、heapdump.***.phd、core.***.dmp、Snap.***.trc
- Java 静态变量、非静态代码块、构造函数的执行顺序
- java.util.concurrent介绍
- Caffe 源码的修改(用于车辆的定位)
- Spring注解详解
- 钣喷
- Codeforces Round #200 (Div. 2)344C Rational Resistance(模拟)