水题一发。无奈自己没有好好审清题意,另外快速幂居然写错了- =
快速幂在过程中修改a的值,但是我却计算成了在偶数时相乘,调试半天。看来还是咩有好好理解啊。
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <vector> #include <map> #include <algorithm> #include <queue> #include <cmath> #include <bitset> using namespace std; // 大数,内存处理 #define INF 0x3f3f3f3f #define ll long long int #define MEM(a) memset(a, 0, sizeof(a)) #define MEMM(a) memset(b, -1, sizeof(b)) #define DEB(x, n) cout << (x) << " " << (n) << endl const double PI = acos(-1.0); #define CR printf("\n") // 调试用 template <class Type> void debug(Type a[], int len) { for(int i = ; i < len ; i++) { cout << a[i] << " "; } cout << endl; } ll p; ll pow_mod(ll a, ll n) { ll ans = 1; a %= p; while(n) { if(n & 1) ans = ans * a % p; a = a * a % p; n >>= 1; } return ans; } // 3. const int maxn = 10000000 + 10; const int maxp = 700000; int vis[maxn]; int prime[maxp]; // 筛素数 void sieve(int n) { int m = (int) sqrt(n+0.5); memset(vis, , sizeof(vis)); for(int i = 2; i <= m;i ++) if(!vis[i]) for(int j = i*i; j <= n; j+=i) vis[j] = 1; } // 生成素数表 int gen_primes(int n) { sieve(n); int c = ; for(int i = 2; i <= n; i++) if(!vis[i]) prime[c++] = i; return c; } int main() { #ifdef DEBUG // freopen("input", "r", stdin); //从input文件中读入 // freopen("output", "w", stdout); //输出到output文件 #endif ll n; const int bound = 65000+10; gen_primes(bound); while(scanf("%lld", &n) && n!= ) { // p is mod p = n; if(!vis[n]) printf("%lld is normal.\n", n); else { bool find = 1; for(ll i = 2; i < n;i ++) if(pow_mod(i, n) != i) { find = ; break; } if(find) printf("The number %lld is a Carmichael number.\n", n); else printf("%lld is normal.\n", n); } } return ; }