HDU 1395 欧拉函数的基本应用

来源:互联网 发布:魔兽争霸数据修改器 编辑:程序博客网 时间:2024/06/03 21:39
题目给的很明显就是欧拉函数的表达式,由于底是2,所以被取模的数只要是奇数,就能保证与2互质,而定义在一数集上的取模,是一个循环群,  若2^n%p==1,phi(p)是一个循环节,单不能保证它是最短的,所以要遍历它的因数,来找到最小的循环节,就是所求.#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#define MAX 1000007using namespace std;int n;char x;int phi[MAX],m[MAX],p[MAX],pt; void init ( ){    pt = 0;    memset ( m , 0 , sizeof ( m ));    phi[1] = 1;    int k;    for ( int i = 2 ; i < MAX; i++ )    {        if ( !m[i] ) p[pt++]=m[i]=i,phi[i]=i-1;        for ( int j=0;j<pt&&(k=i*p[j]) < MAX-1;j++)        {            m[k] = p[j];            if ( m[i] == p[j] )            {                phi[k] = phi[i]*p[j];                break;            }            else               phi[k] = phi[i]*(p[j]-1);         }    }            }int pow2 ( int index , int mod ){    if ( index == 0 ) return 1;    int temp = pow2 ( index /2 , mod )%mod;    if ( index &1 ) return (temp*temp*2)%mod;    else return temp*temp%mod;} int main ( ){  init();  while ( ~scanf ( "%d", &n ) )  {      if ( !(n&1) || n == 1 )          printf( "2^? mod %d = 1\n",n );      else       {          int temp = phi[n];          for ( int i = 2 ; i <= temp ; i++ )              if ( temp%i==0)              {                 if ( pow2 ( i, n ) != 1 ) continue;                  printf ( "2^%d mod %d = 1\n" , i , n );                 break;               }      }  }  }

0 0
原创粉丝点击