HDU 1395 欧拉函数的基本应用
2015-01-21 15:23
330 查看
题目给的很明显就是欧拉函数的表达式,由于底是2,所以被取模的数只要是奇数,就能保证与2互质,而定义在一数集上的取模,是一个循环群, 若2^n%p==1, phi(p)是一个循环节,单不能保证它是最短的,所以要遍历它的因数,来找到最小的循环节,就是所求. #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define MAX 1000007 using 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 ; 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; } } } }
相关文章推荐
- hdu 1711 hdu 1686 hdu 2203 KMP基本应用
- hdu 3501(欧拉函数的应用)
- Hdu 2824 欧拉函数的应用
- HDU 2588 NOJ 1126 GCD 欧拉函数应用问题
- hdu 1395 2^x mod n = 1(欧拉函数)
- hdu 2588 欧拉函数的应用
- hdu 5728 (欧拉函数性质的应用)
- (hdu step 8.1.2)Train Problem I(站的基本应用——判断一个序列经过栈后是否能够得到第二个序列)
- (hdu step 7.2.2)GCD Again(欧拉函数的简单应用——求[1,n)中与n不互质的元素的个数)
- HDU 2588(欧拉函数的应用)
- HDU--1251 -- 统计难题 [字典树基本应用] [用数组事先分配空间以节约时间]
- hdu(欧拉函数应用,用筛法的方法求phi数组)
- poj2407 Relatives 欧拉函数基本应用
- 【HDU】5321 Beautiful Set【枚举k求贡献,欧拉函数应用】
- Relatives+水题+欧拉函数+素数打表的基本应用+poj
- Hdu-1215 七夕节【算术基本定理应用】
- poj2407 Relatives 欧拉函数基本应用
- hdu 3501(欧拉函数的应用)
- HDU 3501 Calculation 2 (欧拉函数应用)
- HDU 2588 欧拉函数的应用