题意:求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 (唯一分解+推公式+乘法逆元)相关推荐

  1. gcd + 扩展欧几里得定理+递推乘法逆元(模板)

    gcd: int gcd(int a, int b){ return b==0? a: gcd(b, a%b); } 扩张欧几里得定理: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+b ...

  2. 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式

    1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...

  3. 乘法逆元 +数论分块 +平方和公式

    年后准备学习啦,开学还得准备考试. 乘法逆元: 因为涉及到除法,所以取余这个操作就错误. 所以如果我们要求(a/b)%mod,我们可以假设 (a/b)%mod = a*c%mod 那么c就是b的逆元. ...

  4. 求乘法逆元的几种方法

    (数学渣,下面的文字可能有误,欢迎指教) 乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减 ...

  5. 逆元~(乘法逆元及其应用)

    数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 先来引入求余概念 (a +  b) % p = (a%p +  b%p) %p  (对) (a  -  b) % p = (a%p  -  b ...

  6. (组合数求模=乘法逆元+快速幂) Problem Makes Problem

    题目: As I am fond of making easier problems, I discovered a problem. Actually, the problem is 'how ca ...

  7. 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 ...

  8. 整数a关于模m的乘法逆元

    文章目录 模m的乘法逆元 定义 迭代算法 数学归纳法证明 C++代码实现 递归算法 扩展欧几里得算法 代码实现 写法一: 简单证明: 写法二: 简单证明: 算法实现 相关联想以及应用 结尾 模m的乘法 ...

  9. 乘法逆元(inverse element)及四大相关求法详解(含证明)

    文章目录 乘法逆元及四大相关求法详解(含证明) 开胃菜 1. 定义及理解 1.1 乘法逆元的定义 1.1.1 极简定义 1.1.2 详细定义 1.1.3 理解及其相关证明<br> 2. 逆 ...

  10. 【乘法逆元】取模运算

    一,定义 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. ...

最新文章

  1. AtCoder Beginner Contest 198 (A ~ F)题解
  2. 3.NIO_Buffer缓冲区
  3. url映射 ccf (Java正则表达式80分解法)
  4. [2018/11/13]图像处理
  5. 这辆迷你摩托车,很酷!
  6. Linux之JDK安装
  7. 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的
  8. CCF NOI1051 合影
  9. python编程入门教程下载-Python编程从入门到实践的PDF教程免费下载
  10. UIImage保存到相册
  11. linux下led灯驱动程序
  12. 利用简单电阻分压原理自动测量电阻
  13. 服务器系统详细安装步骤
  14. 移动开发技术【安卓】——Android_Studio【Part 1】
  15. 网站ssl证书出现错误如何解决
  16. 在WordPress评论里添加电话、手机号、微信号的表单功能教程
  17. 【锁机制】MySQL锁机制
  18. C语言中 以追加只写方式打开文本文件,C语言文件操作
  19. 35、sparkSQL及DataFrame
  20. C++ Programming language读书笔记

热门文章

  1. W-3 用grub4dos安装Windows7、Ubuntu 12.10双系统(图解)
  2. 【工具】线程安全的JdbcTemplate.java
  3. 分布式服务框架之Dubbo简介
  4. 单调队列:temperature
  5. vue 组件传值$attrs $listeners $bus provide/inject $parent/$children
  6. 【洛谷 2863】牛的舞会
  7. 316 Remove Duplicate Letters 去除重复字母
  8. 第三周阶段性小结——Object对象、String类、StringBuffer、StringBuilder、System、Runtime、Date...
  9. 在Centos6.8上为安装Django1.11.1升级Python2.6到Python3.5
  10. RedHat Linux设置yum软件源为本地ISO