LightOJ - 1050 (唯一分解+推公式+乘法逆元)
题意:求a^b的所有约数和对1e9+7取模的结果
思路:对于一个数p,进行唯一分解,则p=P1^M1*P2^M2*...*Pn^Mn,则p的所有约数之和等于(P1^0+P1^1+...+P1^M1)*(P2^0+P2^1+...+P2^M2)*...*(Pn^0+Pn^1+...+Pn^Mn),
p^t=P1^(M1*t)*P2^(M2*t)*...*Pn^(Mn*t),每一个(Pn^0+Pn^1+...+Pn^Mn)利用等比数列可以直接推出公式为(Pn^(Mn*t+1)-1)/(Pn-1),用快速幂和乘法逆元即可。
注意:n的唯一分解只需要试遍sqrt(n)的所有质数即可,若最后n除不尽,那么最后的n一定是质数。
1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #include <cstdio> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <bitset> 9 #include <algorithm> 10 #include <cmath> 11 #include <cstring> 12 #include <cstdlib> 13 #include <string> 14 #include <sstream> 15 #include <time.h> 16 #define x first 17 #define y second 18 #define pb push_back 19 #define mp make_pair 20 #define lson l,m,rt*2 21 #define rson m+1,r,rt*2+1 22 #define mt(A,B) memset(A,B,sizeof(A)) 23 using namespace std; 24 typedef long long LL; 25 const double PI = acos(-1); 26 const int N=1e5+10; 27 const LL mod=1e9+7; 28 const int inf = 0x3f3f3f3f; 29 const LL INF=0x3f3f3f3f3f3f3f3fLL; 30 vector<LL> prime; 31 int vis[N]; 32 void init() 33 { 34 mt(vis,0); 35 LL m=sqrt(N+0.5); 36 for(LL i=2;i<=m;i++) 37 { 38 if(!vis[i])for(LL j=i*i;j<=N;j+=i)vis[j]++; 39 } 40 for(LL i=2;i<N;i++)if(!vis[i])prime.pb(i); 41 } 42 void gcd(LL a,LL b,LL& d,LL& x,LL& y) 43 { 44 if(!b){d=a;x=1;y=0;} 45 else{gcd(b,a%b,d,y,x);y-=x*(a/b);} 46 } 47 LL inv(LL a,LL n) 48 { 49 LL d,x,y; 50 gcd(a,n,d,x,y); 51 return d==1?(x+n)%n:-1; 52 } 53 LL pow_mod(LL a,LL n) 54 { 55 LL res=1; 56 while(n) 57 { 58 if(n&1)res=(res*a)%mod; 59 a=(a*a)%mod; 60 n/=2; 61 } 62 return res; 63 } 64 LL solve(LL a,LL n) 65 { 66 LL ans,p; 67 ans=(pow_mod(a,n)-1+mod)%mod; 68 p=inv(a-1,mod); 69 return (ans*p)%mod; 70 } 71 int main() 72 { 73 #ifdef Local 74 freopen("data.txt","r",stdin); 75 #endif 76 ios::sync_with_stdio(false); 77 cin.tie(0); 78 init(); 79 int T; 80 LL n,m,ans; 81 cin>>T; 82 for(int d=1;d<=T;d++) 83 { 84 cout<<"Case "<<d<<":"<<" "; 85 ans=1; 86 cin>>n>>m; 87 for(int i=0;i<prime.size()&&n!=1;i++) 88 { 89 int k=0; 90 if(n%prime[i]==0) 91 { 92 while(n%prime[i]==0) 93 { 94 n/=prime[i]; 95 k++; 96 } 97 ans=(ans*solve(prime[i],(LL)(k*m+1)))%mod; 98 k=0; 99 } 100 } 101 if(n>1)ans=(ans*solve(n,(LL)(m+1)))%mod; 102 cout<<ans<<endl; 103 } 104 #ifdef Local 105 cerr << "time: " << (LL) clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl; 106 #endif 107 }
View Code
转载于:https://www.cnblogs.com/27sx/p/6417897.html
LightOJ - 1050 (唯一分解+推公式+乘法逆元)相关推荐
- gcd + 扩展欧几里得定理+递推乘法逆元(模板)
gcd: int gcd(int a, int b){ return b==0? a: gcd(b, a%b); } 扩张欧几里得定理: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+b ...
- 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式
1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...
- 乘法逆元 +数论分块 +平方和公式
年后准备学习啦,开学还得准备考试. 乘法逆元: 因为涉及到除法,所以取余这个操作就错误. 所以如果我们要求(a/b)%mod,我们可以假设 (a/b)%mod = a*c%mod 那么c就是b的逆元. ...
- 求乘法逆元的几种方法
(数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...
- 逆元~(乘法逆元及其应用)
数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 先来引入求余概念 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b ...
- (组合数求模=乘法逆元+快速幂) Problem Makes Problem
题目: As I am fond of making easier problems, I discovered a problem. Actually, the problem is 'how ca ...
- java乘法逆元与除法取模,关于数论乘法逆元及相关知识点
在求解a/b%m时,可以转化为(a%(b*m))/b,转化过程如下 令k = (a/b)/m(向下取整), x = (a/b)%m; a/b = k*m + x (x < m); a = k*b ...
- 整数a关于模m的乘法逆元
文章目录 模m的乘法逆元 定义 迭代算法 数学归纳法证明 C++代码实现 递归算法 扩展欧几里得算法 代码实现 写法一: 简单证明: 写法二: 简单证明: 算法实现 相关联想以及应用 结尾 模m的乘法 ...
- 乘法逆元(inverse element)及四大相关求法详解(含证明)
文章目录 乘法逆元及四大相关求法详解(含证明) 开胃菜 1. 定义及理解 1.1 乘法逆元的定义 1.1.1 极简定义 1.1.2 详细定义 1.1.3 理解及其相关证明<br> 2. 逆 ...
- 【乘法逆元】取模运算
一,定义 1 逆元: 在群G中,∀a∈G,∃a′∈G,s.t.aa′=e,其中e为G的单位元. 2 乘法逆元: p为素数,记a⋅b=a×bmodp在群(N,⋅)(N,·)中,∀a∈N,∃a′∈N,s. ...
最新文章
- AtCoder Beginner Contest 198 (A ~ F)题解
- 3.NIO_Buffer缓冲区
- url映射 ccf (Java正则表达式80分解法)
- [2018/11/13]图像处理
- 这辆迷你摩托车,很酷!
- Linux之JDK安装
- 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的
- CCF NOI1051 合影
- python编程入门教程下载-Python编程从入门到实践的PDF教程免费下载
- UIImage保存到相册
- linux下led灯驱动程序
- 利用简单电阻分压原理自动测量电阻
- 服务器系统详细安装步骤
- 移动开发技术【安卓】——Android_Studio【Part 1】
- 网站ssl证书出现错误如何解决
- 在WordPress评论里添加电话、手机号、微信号的表单功能教程
- 【锁机制】MySQL锁机制
- C语言中 以追加只写方式打开文本文件,C语言文件操作
- 35、sparkSQL及DataFrame
- C++ Programming language读书笔记
热门文章
- W-3 用grub4dos安装Windows7、Ubuntu 12.10双系统(图解)
- 【工具】线程安全的JdbcTemplate.java
- 分布式服务框架之Dubbo简介
- 单调队列:temperature
- vue 组件传值$attrs $listeners $bus provide/inject $parent/$children
- 【洛谷 2863】牛的舞会
- 316 Remove Duplicate Letters 去除重复字母
- 第三周阶段性小结——Object对象、String类、StringBuffer、StringBuilder、System、Runtime、Date...
- 在Centos6.8上为安装Django1.11.1升级Python2.6到Python3.5
- RedHat Linux设置yum软件源为本地ISO