Timus 1204 Idempotents

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1204

题目描述:

  x*x ≡ x (mod n) ,求解所有满足该式的x值,其中n为两个不同的素数的积,并且有x<n;

那么假设n=p*q,且 x mod n = x, 然后易得到 x*x = a*n + x,则 x(x-1) = a*n, 则必有两个解0和1

故剩余情况等价于求 a1*p + a2*q = 1的解,其中a1*a2=-a(a !=0 )

为扩展的欧几里得了,其中为正的一项为解,还有一个解即增一次即可,两次则会超过n,故有且仅有4个解。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std ;
 5 
 6 const int MAXM = 100000 ;
 7 int k, n ;
 8 int prims[MAXM], totals ;
 9 bool is_prim[MAXM] ;
10 
11 void init(){
12     memset(is_prim, true, sizeof(is_prim)) ;
13     totals = 0 ;
14     for( int i = 2; i < MAXM; i++ ){
15         if( is_prim[i] ){
16             for( int j = 2; j*i < MAXM; j++ )    is_prim[i*j] = false ;
17             prims[totals++] = i ;
18         }
19     }
20 }
21 
22 void extGcd(int& x, int& y, int p, int q){
23     if( q == 0 ){
24         x = 1, y = 0 ;
25         return ;
26     }
27     extGcd(x, y, q, p%q) ;
28     int t = y ;
29     y = x - (p/q)*y ;
30     x = t ;
31 }
32 
33 void solve(){
34     cout << "0 1 " ;
35     int p, q ;
36     for( int i = 0; i < totals && prims[i]*prims[i] < n; i++ ){
37         if( n % prims[i] == 0 )    p = prims[i], q = n / prims[i] ;
38     }
39     int x, y ;
40     extGcd(x, y, p, q) ;
41     if( x > 0 ){
42         cout << x*p << " " << (y+p)*q << endl ;
43     }else{
44         cout << y*q << " " << (x+q)*p << endl ;
45     }
46 }    
47 
48 int main(){
49     //freopen("1234.txt", "r", stdin) ;
50     cin >> k ;
51     init() ;
52     while( k-- ){
53         scanf("%d", &n) ;
54         solve() ;
55     }
56     return 0 ;
57 }

 

posted @ 2016-04-10 16:58  ct_usl  阅读(310)  评论(0编辑  收藏  举报