欧拉函数 / 蒙哥马利快速幂 / 容斥

一:知识点

欧拉函数参考1

浅谈欧拉函数参考2

欧拉函数的定义:

在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质(即gcd为1)的正整数(包括1)的个数,记作φ(n)。

      

欧拉函数的延伸:

  小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2  (n>1)。

欧拉函数φ(x)模板:

ll Euler(int n)//即求φ(x)
{
    ll ret=n;
    for(int i=2;i<=sqrt(n);i++)
     if(n%i==0)
      {
        ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
        while(n%i==0)
          n/=i;
     }
    if(n>1)
          ret=ret/n*(n-1);
        return ret;
}

蒙哥马利快速幂

  蒙哥马利(Montgomery)幂模运算是快速计算a^b%k的一种算法,是RSA加密算法的核心之一。

算法模板:

ll Montgomery(ll base,ll exp)
{
    ll res = 1;
    while(exp)
    {
        if ( exp&1 )
            res = (res*base) % mod;
        exp >>= 1;
        base = (base*base) % mod;
    }
    return res;
}

容斥原理参考:(其证明参考)

  实用:若gcd(n,i) == 1,那么gcd(n,n-i)==1

/*************************************************************************************************************************************/

二:牛客例题:小a与黄金街道

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

小a和小b来到了一条布满了黄金的街道上。它们想要带几块黄金回去,然而这里的城管担心他们拿走的太多,于是要求小a和小b通过做一个游戏来决定最后得到的黄金的数量。
游戏规则是这样的:
假设道路长度为n米(左端点为0,右端点为n),同时给出一个数k(下面会提到k的用法)
设小a初始时的黄金数量为A,小b初始时的黄金数量为B
小a从1出发走向n?1,小b从n?1出发走向1,两人的速度均为1m/s
假设某一时刻(必须为整数)小a的位置为x,小b的位置为y,若gcd(n,x)=1且gcd(n,y)=1,那么小a的黄金数量A会变为A?k^x(kg),小b的黄金数量B会变为B?k^y(kg)
当小a到达n?1时游戏结束
小a想知道在游戏结束时A+B的值
答案对1e9+7取模

输入描述:

一行四个整数n,k,A,B

输出描述:

输出一个整数表示答案

示例1

输入

4 2 1 1

输出

32

说明

初始时A=1,B=1

第一个时刻如图所示,小a在1,小b在3,满足条件,此时A=1?21=2,B=1?23=8A=1?21=2,B=1?23=8

第二个时刻小a在2,小b在2,不满足条件

第三个时刻小a在33,小b在11,满足条件,此时A=2?23=16,B=8?21=16A=2?23=16,B=8?21=16

此时游戏结束A=2?23=16,B=8?21=16A=2?23=16,B=8?21=16

A+B=32

示例2

输入

5 1 1 1

输出

2

备注:

保证 3?n?1e8 , 1? A, B, k ?1e13

AC代码:

/***********************************************/
ll Montgomery(ll base,ll exp)//base 底数,exponential 指数,mod 模
{
    ll res = 1;
    while(exp)
    {
        if ( exp&1 )
            res = (res*base) % mod;
        exp >>= 1;
        base = (base*base) % mod;
    }
    return res;
}

 ll Euler(int n)
{
    ll ret=n;
    for(int i=2;i<=sqrt(n);i++)
     if(n%i==0)
      {
        ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
        while(n%i==0)
          n/=i;
     }
    if(n>1)
          ret=ret/n*(n-1);
        return ret;
}

int main()
{
    ll k,A,B;
    int n;
    cin>>n>>k>>A>>B;
    ll a=Euler(n)*n/2;

    ll p=Montgomery(k,a);
    cout<<(p*(A+B)%mod)%mod<<endl;
    return 0;
}

  

原文地址:https://www.cnblogs.com/liuyongliu/p/10305877.html

时间: 2024-10-08 03:55:35

欧拉函数 / 蒙哥马利快速幂 / 容斥的相关文章

POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,数论-整数快速幂)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7693   Accepted: 2522 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 45  Solved: 8[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢

HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1]*f[n-2].然后a和b系数都是呈斐波那契规律增长的.需要先保存下来指数.但是太大了.在这里不能用小费马定理.要用降幂公式取模.(A^x)%C=A^(x%phi(C)+phi(C))%C(x>=phi(C)) Phi[C]表示不大于C的数中与C互质的数的个数,可以用欧拉函数来求. 矩阵快速幂也不

poj3696 快速幂的优化+欧拉函数+gcd的优化+互质

这题满满的黑科技orz 题意:给出L,要求求出最小的全部由8组成的数(eg: 8,88,888,8888,88888,.......),且这个数是L的倍数 sol:全部由8组成的数可以这样表示:((10^x)-1)*(8/9) 那么有m=((10^x)-1)*(8/9)=k*L,answer即满足条件的最小的x 性质1:若ax=by且a和b互质,那么说明a中没有任何b的质因子,b的质因子一定都在x里.所以x是b的倍数. 所以先想方设法在等式中构造两个互质的数以便化简.我们取p=8/gcd(8,L

快速幂 生成素数表 生成Euler欧拉函数值表

快速幂: int pow_mod(LL a,LL b) { int num=1; while(b) { if(b&1) num=(num*a)%MOD; a=(a*a)%MOD; b>>=1; } return num; } 生成素数表: bool flag[maxn]={0}; void Prime(int x) { for(int i=2;i<=x;i++) { if(flag[i]) continue; prime[cnt++]=i; for(int j=2;i*j<

hdu 3307 Description has only two Sentences (欧拉函数+快速幂)

Description has only two SentencesTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 852 Accepted Submission(s): 259 Problem Descriptionan = X*an-1 + Y and Y mod (X-1) = 0.Your task is to calculate th

BZOJ1408 NOI2002 Robot 快速幂+欧拉函数

题意:分别求所有质因数都不同且质因数个数为奇数个.偶数个的数的欧拉函数和,和质因数存在重复的数的欧拉函数和 题解: 说书题……前面一大串就是用一种比较有趣的语言定义欧拉函数. 显然我们只需要求出所有军人ans1和政客ans2,然后用求得的M减去独立数和就是学者的独立数和了. 由于善良的出题人已经帮我们把M给质因分解了,因此我们假定当前已经得到了ans1和ans2,那么根据欧拉函数的定义,ans1'=ans1+ans2*(p-1),ans2'=ans2+ans1*(p-1),因为新加入的质因子会让

Super A^B mod C 快速幂+欧拉函数降幂

uper A^B mod C Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are

hdu 2837 Calculation【欧拉函数,快速幂求指数循环节】

欢迎关注__Xiong的博客: http://blog.csdn.net/acmore_xiong?viewmode=list Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1912    Accepted Submission(s): 413 链接:click me Problem Description A