数论-Description has only two Sentences HDU - 3307 (欧拉函数+欧拉定理)

欧拉定理表明,若n,a为正整数,且n,a互质,则:
在这里插入图片描述
费马小定理:
a是不能被质数p整除的正整数,则有a^(p-1) ≡ 1 (mod p)
证明这个定理非常简单,由于p是质数,所以有φ§ = p-1,代入欧拉定理即可证明。推论:对于任意正整数a,有a^p ≡ a (mod p),因为a能被p整除时结论显然成立。
Description has only two Sentences

a n = Xa n-1 + Y and Y mod (X-1) = 0.
Your task is to calculate the smallest positive integer k that a k mod a 0 = 0.
Input Each line will contain only three integers X, Y, a 0 ( 1 < X < 2 31, 0 <= Y < 2 63, 0 < a 0 < 2 31).OutputFor each case, output the answer in one line, if there is no such k, output “Impossible!”.
Sample Input
2 0 9
Sample Output
1
题意: 给出公式及x,y,a0的值(y%(x-1)=0),求使ak%a0=0的k的最小值。
思路:在纸上推一下可以推出所求的k值是使(x^k-1)
(y/(x-1))=0(mod a0)。令B=(y/(x-1)),为了使用欧拉定理,必须把(y/(x-1))消去,所以求gcd(a0,B),且a0=a0/gcd。
所以,问题转化为求最小的k使x^k=1(mod a0),而欧拉定理要求x与a0互质。所以,首先判断gcd(x,a0)是否为1:若不为1,则无解;否则用欧拉定理求解。
(先求出a0的欧拉函数值,然后枚举k的取值,注意用i*i<=phi(a0),不然会超时。)

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#define LL long long
using namespace std;
LL euler(LL n)
{
    LL res=n,a=n;
    for(int i=2;i*i<=a;i++)
        if(a%i==0)
    {
        res=res/i*(i-1);
        while(a%i==0)
        a/=i;
    }
    if(a>1)
        res=res/a*(a-1);
    return res;
}
LL gcd(LL a,LL b)
{
	if(b==0)
	  return a;
	else
	  return gcd(b,a%b);
}
LL ppow(LL a,LL n,LL mod)
{
	LL ans=1;
	while(n)
	{
		if(n%2==1)
		   ans=(ans*a)%mod;
	    a=(a*a)%mod;
	    n/=2;
	}
	return ans%mod;
}
int main()
{
   LL x,y,a0;
   while(scanf("%lld%lld%lld",&x,&y,&a0)!=EOF)
   {
   	    LL c=y/(x-1);
   	    LL g=gcd(c,a0);
   	    a0/=g;
   	    if(gcd(x,a0)!=1)
   	    {
   	        cout<<"Impossible!\n";
			continue;	
		}
	   	LL n=euler(a0);
	   	LL m=n;
	   	LL i;
	   	LL ans=n;
	   	for(i=2;i*i<=m;i++)
	   	{
	   	   if(m%i==0)
	   	   {
	   	   	   if(ppow(x,i,a0)==1)
	   	   	    ans=min(ans,i);
	   	   	   if(ppow(x,m/i,a0)==1)
	   	   	    ans=min(ans,m/i);
	   	   	    
		   }
		}
		cout<<ans<<endl;
		
		 
   }



   return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值