hdu 3307 欧拉定理+等比数列

本文探讨了通过等比数列的知识解决特定数学问题的方法,并引入了循环群的概念来进一步解析问题。文中还提供了相应的算法实现,包括求解最小循环节及使用欧拉定理的相关计算。
部署运行你感兴趣的模型镜像

利用等比数列知识,

an = x*an-1 + Y

故an +A = x * an-1 + Y + A

故an +A = x ( an-1 + (Y+A)/x)

令 A = (Y+A)/X

所以(X-1)*A = Y

得出 A = Y/(X-1)

所以{an+A}是等比数列;

所以an/a0 = X^n + P*(X^n-1)/a0

转换成X^n%(a0/p) = 1 符合欧拉定理,

所以由x^n组成的集合是个循环群,phi(a/p)是循环节,而且最小循环节必定是phi(a/p)的因数.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

typedef long long LL;

LL euler ( LL x )
{
    LL res = x;
    for ( LL i = 2 ; i * i <= x ; i++ )
    {
        if ( x%i==0 )
           res -= res/i;
        while ( x%i==0 ) x/=i; 
    }
    if ( x > 1 ) res -= res/x;
    return res;
}

LL gcd ( LL x , LL y )
{
    return y==0? x : gcd ( y , x%y );
}

LL pow2 ( LL num ,LL index , LL mod  )
{
    if ( index == 0 ) return 1;
    LL temp = pow2 ( num , index/2, mod  );
    if ( index &1 ) return temp%mod*temp%mod*num%mod;
    else return temp%mod*temp%mod;
}

int main ( )
{
    LL x , y , a;
    while ( ~scanf ( "%lld%lld%lld" , &x , &y , &a ) )
    {
        if ( y == 0 ) 
        {
            puts("1");
            continue;
        }
        LL p = y/(x-1);
        a = a/gcd ( p , a );
        if ( gcd ( x , a) == 1 )
        {
            LL n = euler ( a );
            LL minn = n;
            for ( LL i = 2 ; i*i <= n ; i++ )
            {
                if ( n%i ) continue;
                if ( pow2 ( x , i ,a ) == 1 )
                    minn = min ( i , minn );
                if ( pow2 ( x , n/i , a ) == 1 )
                   minn = min ( n/i , minn ); 
            }
            printf ( "%I64d\n" , minn );
        }
        else puts ( "Impossible!" );
    }
}



您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值