幂自守数

如同 2001^2001的末四位仍为2001的数称为幂自守数。

输入 : k,m; 2<=k<=16 && 1<=m<=4,输出所有幂自守数及其总数.

分析:穷举+二分。二分幂不断取余,时间复杂度nlogn。

 

代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 const char letter[16] = {'0', '1' ,'2','3','4','5','6','7','8','9','A','B' ,'C','D','E','F' };
 5 int L,sum = 0,k,m;
 6 
 7 long long Power(int ep, int ex) //计算其为多少位数
 8 {
 9         long long rst = ep;
10         for( int i = 1; i < ex; i++ )
11                 rst *= ep;
12         cout<<rst<<endl;
13         return rst;
14 }
15 
16 long long powerl( long long  x , long long  p) //将这个四位数,二分并且对L取余。
17 {
18         if(p > 1){
19                 long long Q = powerl(x,p/2);
20                 if(p&1) return Q*Q%L*x%L;
21                 else return Q*Q%L;
22         }else return x%L;
23 }
24 
25 bool ok(int x){
26         return powerl(x,x) == x;
27 }
28 
29 void Print( int x ) //输出符合题意的答案.
30 {
31      //   if(x == 0){
32         int s[6];
33         sum ++;
34         for( int i = 0; i < m; i++)
35         {
36                 s[i] = x%k;
37                 x/=k;
38         }
39         for(int i = m - 1; i >= 0; i--) printf("%c",letter[s[i]]);
40         printf("\n");
41       //  }
42 }
43 
44 int main()
45 {
46    scanf("%d%d",&k,&m);
47    L = Power(k,m); //返回k的m次方
48    for(int i = 1;i < L; i++)
49         if(ok(i)) Print(i); //判断并输出
50         printf("In all %d.\n",sum);
51     return 0;
52 }

 

#include <bits/stdc++.h>
using namespace std;const char letter[16] = {'0', '1' ,'2','3','4','5','6','7','8','9','A','B' ,'C','D','E','F' };int L,sum = 0,k,m;
long long Power(int ep, int ex) //计算其为多少位数{        long long rst = ep;        for( int i = 1; i < ex; i++ )                rst *= ep;        cout<<rst<<endl;        return rst;}
long long powerl( long long  x , long long  p) //将这个四位数,二分并且对L取余。{        if(p > 1){                long long Q = powerl(x,p/2);                if(p&1) return Q*Q%L*x%L;                else return Q*Q%L;        }else return x%L;}
bool ok(int x){        return powerl(x,x) == x;}
void Print( int x ) //输出符合题意的答案.{     //   if(x == 0){        int s[6];        sum ++;        for( int i = 0; i < m; i++)        {                s[i] = x%k;                x/=k;        }        for(int i = m - 1; i >= 0; i--) printf("%c",letter[s[i]]);        printf("\n");      //  }}
int main(){   scanf("%d%d",&k,&m);   L = Power(k,m); //返回k的m次方   for(int i = 1;i < L; i++)        if(ok(i)) Print(i); //判断并输出        printf("In all %d.\n",sum);    return 0;}

 

posted on 2015-08-12 19:29  小松song  阅读(161)  评论(0)    收藏  举报

导航