幂自守数
如同 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;}
浙公网安备 33010602011771号