POJ 3696 欧拉定理的应用 快速幂

说实话这道题对着别人的题解做都做了好久......

进入正题:

由8组成的数可以表示为(10^{x}-1)*8/9

(10^{x}-1)*8/9=L*k(k=1,2,3,4,.........)   ;

令p=8/gcd(L,8);q=9*L/(gcd(L,8));

由于p,q互质(自己想一下,实在不行带几个数字看看);

则:(10^{x}-1)*p=k*q

所以只有 q|(10^{x}-1)才满足等式;(10^{x}-1)%q)= 0%q=0;

10^{x}\equiv1(modq);

由欧拉定理可知当gcd(10,q)=1时才有解;

在有解下试除x=\phi (q)的素因子既能得到最小解;

扫描二维码关注公众号,回复: 3023085 查看本文章

注意:直接用快速幂可能会爆long long

#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define PI acos(-1)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const ll N=1000;
ll phi_prime[N];
ll Gcd(ll a,ll b)
{
   if(b==0)return a;
   else return Gcd(b,a%b);
}
ll getphi(ll n)
{
   ll t=n;
   for(ll i=2;i*i<=n;i++)
   {
      if(n%i==0)
      {
         t=t-t/i;
         while(n%i==0)n=n/i;
	  }
   }
   if(n!=1)t=t-t/n;
   return t;
}
ll mul(ll a,ll b,ll mod)
{
  a%=mod,b%=mod;
  ll s=a,sum=0;
  while(b)
  {
    if (b&1)
    {
      sum+=s;
      if (sum>=mod) sum-=mod;
    }
    b>>=1;
    s<<=1;
    if (s>=mod) s-=mod;
  }
  return sum;
}
ll Pow(ll x,ll n,ll mod)
{
   x=x%mod;
   ll result=1;
   while(n>0)
   {
      if(n&1)result=mul(result,x,mod);
      x=mul(x,x,mod);
      n=n>>1;
   }
   return result;
}
ll get_phi_prime(ll phi)
{
   ll num=0;
   for(ll i=2;i*i<=phi;i++)
   {
      if(phi%i==0)
      {
         phi_prime[num++]=i;
         while(phi%i==0)phi=phi/i;
	  }
   } 
   if(phi!=1)phi_prime[num++]=phi;
   return num;
}
ll solve(ll phi,ll q)
{
   ll num=get_phi_prime(phi);
   for(ll i=0;i<num;i++)
   {
      while(1)
      {
        phi=phi/phi_prime[i];
        if (Pow(10,phi,q)!=1)
        {
          phi=phi*phi_prime[i];
          break;
        }
        else if (phi%phi_prime[i]) break;
      }
   }
   printf("%lld\n",phi);
}
int main()
{
    ll n,gcd,q,p;
    ll cas=0;
    while(~scanf("%lld",&n))
    {
       cas++;
	   if(n==0)break;
	   printf("Case %lld: ",cas);
       gcd=Gcd(n,8);
       p=8/gcd,q=n*9/gcd;
       if(Gcd(10,q)!=1)
       {
          printf("0\n");
          continue;
	   }
	   solve(getphi(q),q);
	}
} 

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/82147021