hdu 3307(欧拉函数+好题)

Description has only two Sentences

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1071    Accepted Submission(s): 323

Problem Description

an = X*an-1 + Y and Y mod (X-1) = 0.
Your task is to calculate the smallest positive integer k that ak mod a0 = 0.

Input

Each line will contain only three integers X, Y, a0 ( 1 < X < 231, 0 <= Y < 263, 0 < a0 < 231).

Output

For each case, output the answer in one line, if there is no such k, output "Impossible!".

Sample Input

2 0 9

Sample Output

1

很好的一个题目。

思路:对于此数列我们可以得到其通项为:

an = a0*xn + (1+x+x2+..xn-1)Y = (xn-1)/(x-1)*Y+a0xn

假设ak%a0 = 0,那么我们代入得 ((xk-1)/(x-1)*Y+a0xk)%a0 =0 又因为题目中说过Y%(x-1)=0 所以设 Y=Y/(x-1)。

最终我们得到 ak%a0 = (xn-1)*Y%a0 = 0 接下来就是这个题目的难点了 ,这个地方我至今无法想通,如果有大牛的话请指教一二。

我们得到 d = gcd(Y,a0),那么这个式子就变成了 (xn-1)*(Y/d)%(a0/d) = 0 ,又因为 Y/d 与 a0/d 互质,取模不可能为0,设 a = a0/d 所以最终我们得到:

(xn-1)%a = 0 ----------> xn%a=1 这里就可以根据欧拉定理求解了。

欧拉定理:若n,a为正整数,且n,a互素,则: 

这里求出的欧拉函数不一定是最小的解,所以要到它的因子里面去找。

但是我还是想不通为什么要求出最大公约数之后再进行求解?

我在想是不是形如(xn-1)*y%a=0的式子可以都可以变成 (xn-1)%(a/gcd(y,a))=0进行求解???BUT,WHY??

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
typedef long long LL;
LL e[100][2];
LL phi(LL x)
{
    LL ans=x;
    for(LL i=2; i*i<=x; i++)
        if(x%i==0)
        {
            ans=ans/i*(i-1);
            while(x%i==0) x/=i;
        }
    if(x>1)
        ans=ans/x*(x-1);
    return ans;
}
LL gcd(LL a,LL b)
{
    return b==0?a:gcd(b,a%b);
}
LL pow_mod(LL a,LL n,LL mod)
{
    LL ans = 1;
    while(n)
    {
        if(n&1) ans=ans*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return ans;
}
void devide(LL ans,int &id)
{
    for(LL i=2; i*i<=ans; i++) ///分解质因数
    {
        if(ans%i==0)
        {
            e[id][0]=i;
            e[id][1]=0;
            while(ans%i==0) ans/=i,e[id][1]++;
            id++;
        }
    }
    if(ans>1)
    {
        e[id][0]=ans;
        e[id++][1]=1;
    }
}

int main()
{
    LL X,Y,a0;
    while(~scanf("%lld%lld%lld",&X,&Y,&a0))
    {
        Y = Y/(X-1);
        LL d = gcd(Y,a0);
        a0 = a0/d;
        if(gcd(X,a0)!=1)
        {
            printf("Impossible!\n");
        }
        else
        {
            LL ans = phi(a0);
            int id = 0;
            devide(ans,id);
            for(int i=0; i<id; i++)
            {
                for(int j=0; j<e[i][1]; j++)
                {
                    if(pow_mod(X,ans/e[i][0],a0)==1) ans/=e[i][0]; ///分解本身,得到 X^ans % a0 = 1的最小ans
                }
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}
时间: 2024-10-18 15:08:00

hdu 3307(欧拉函数+好题)的相关文章

(hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)

题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 166 Accepted Submission(s): 96   Problem Description The Euler function phi is an important kind of function in number theory

poj2478 欧拉函数水题

poj2478 欧拉函数水题 Y - Farey Sequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2478 Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational number

hdu2824 The Euler function 筛选法求欧拉函数模板题

//求a , b范围内的所有的欧拉函数 //筛选法求欧拉函数模板题 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 3000010 ; typedef __int64 ll ; int e[maxn] ; int a ,  b ; void Euler() { int i,j; for (i=1;i<maxn;i++) e[i]

hdu 2824(欧拉函数)

The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5235    Accepted Submission(s): 2225 Problem Description The Euler function phi is an important kind of function in number theo

POJ 2407 Relatives(欧拉函数入门题)

Relatives Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz. Input There are several t

hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不会 就自己写了个容斥搞一下(才能维持现在的生活) //别人的题解https://blog.csdn.net/luyehao1/article/details/81672837 #include <iostream> #include <cstdio> #include <cstr

poj2407(欧拉函数模板题)

题目链接:https://vjudge.net/problem/POJ-2407 题意:给出n,求0..n-1中与n互质的数的个数. 思路:欧拉函数板子题,先根据唯一分解定理求出n的所有质因数p1,p2,...,pn,然后根据Φ(m)=m*∏(1-1/pi)计算即可. AC代码: #include<cstdio> using namespace std; int n,ans; int main(){ while(scanf("%d",&n),n){ ans=n; f

hdu 1787(欧拉函数+水题)

题意:给出一个n,求小于n大于0的所有与n不互质的数的个数 是一道欧拉函数的模板题 1 #include<iostream> 2 #include<string.h> 3 #include<string> 4 #include<sstream> 5 #include<vector> 6 #include<deque> 7 #include<map> 8 #include<algorithm> 9 #includ

【BZOJ4173】数学 欧拉函数神题

[BZOJ4173]数学 Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 题解:STEP 1: 这步还是很容易的吧~毕竟原来的式子不太舒服.但是注意,最后一个式子的取值只能为0或1,所以就变成了. STEP 2: 这步倒是难理解一些,但是考虑:我们将这三个等式都算出来,如果满足了左边那个条件,那么这三个等式加起来为1,对答案的贡献正好为$\varphi