博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3307 简单的指数循环节
阅读量:6004 次
发布时间:2019-06-20

本文共 1397 字,大约阅读时间需要 4 分钟。

#include<stdio.h>

#include<string.h>
#include<algorithm>
#define LL __int64
using namespace std;
LL mult_mod(LL a,LL b,LL c)
{
    a%=c;
    b%=c;
    LL ret=0;
    while(b)
    {
        if(b&1){ret+=a;ret%=c;}
        a<<=1;
        if(a>=c)a%=c;
        b>>=1;
    }
    return ret;
}
LL PowerMod(LL a, LL b, LL c)
{
    
    LL ans = 1;
    LL k = a % c;
    while(b>0)    //(k*k % c)2^b %c
    {
        if(b&1)
            ans = mult_mod(ans,k,c);
        b = b>>1;
        k = mult_mod(k,k,c);
    }
    return ans;
}
LL phi(LL n)  
{  
    LL rea=n,i;  
    for(i=2;i*i<=n;i++)  
    {  
        if(n%i==0)  
        {  
            rea=rea-rea/i;  
            while(n%i==0) n/=i;  
        }  
    }  
    if(n>1)  
        rea=rea-rea/n;  
    return rea;  
}  
/*
 from acdreamer http://blog.csdn.net/acdreamers/article/details/8990803
*/
LL gcd(LL X,LL m) //X<m
{
    if(X==0){return m;}
    return gcd(m%X,X);
}
LL divs[1000005];
LL loop(LL pval,LL X,LL m)
{
    int i,size = 0;
    for(i=1;i*i<=pval;i++)
    {    
        if(pval%i==0)
        {
            divs[size++] = i;
            divs[size++] = pval/i;
        }
    }
    sort(divs,divs+size);
    for(i=0;i<size;i++)
    {
        if(PowerMod(X,divs[i],m)==1)
        {
            return divs[i];    
        }
    }
}
int main()
{
    LL X,Y,m,c,val,r;
    while(scanf("%I64d%I64d%I64d",&X,&Y,&m)!=EOF)
    {
        c = Y/(X-1);
        if(c % m==0){printf("1\n");continue;}
        if(c>m)
        {
            m = m / gcd(m,c);
        }
        else
        {
            m = m / gcd(c,m);
        }
        if(X<m)
        {
            if(gcd(X,m)!=1){printf("Impossible!\n");continue;}
        }
        else
        {
            if(gcd(m,X)!=1){printf("Impossible!\n");continue;}
        }
        
        val = phi(m);
        r = loop(val,X,m);
        printf("%I64d\n",r);
    }
}
/*
c * ( X^k -1 ) mod a  ->  X^k - 1 mod a/gcd(c,m) ;
*/

转载于:https://www.cnblogs.com/Milkor/p/4561074.html

你可能感兴趣的文章
Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小...
查看>>
ribbion的负载均衡之端口的切换
查看>>
Kettle 环境变量设置
查看>>
vue项目导出EXCEL功能
查看>>
给老婆的一篇文章
查看>>
实际案例:在现有代码中通过async/await实现并行
查看>>
jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求
查看>>
【并查集】String Reconstruction
查看>>
闲话__stdcall, __cdecl, __fastcall出现的历史背景以及各自解决的问题
查看>>
NOI后训练记录
查看>>
二分法和牛顿迭代法
查看>>
OutLook The profile name you entered already exists.Enter a different profile name.
查看>>
Shell命令-文件压缩解压缩之gzip、zip
查看>>
The Unique MST
查看>>
个人总结
查看>>
uva 673 Parentheses Balance
查看>>
申请Let’s Encrypt免费证书,给自己网站增加https访问
查看>>
javascript+html 实现隐藏 显示
查看>>
BZOJ 2120 数颜色
查看>>
正则表达式学习笔记——基础知识
查看>>