poj 1142
题目:http://poj.org/problem?id=1142
如果一个数本身是素数,那么这个数不是Smith Numbers,如果一个数不是素数,那么10 ^ 4( n 最多 8 位)以内一定有它的质因子,打出10000以内的素数,分解求和,从 n + 1往后枚举
View Code
1 const int N = 10001; 2 int prime[N]; 3 bool vis[N]; 4 int num,tnum; 5 void is_prime() 6 { 7 int i,j; 8 num = 0; 9 for(i = 2; i <= N; i++) 10 { 11 if(!vis[i]) prime[num ++] = i; 12 for(j = 2; j * i <= N; j++) 13 { 14 if(vis[j * i]) continue; 15 vis[j * i] = true; 16 } 17 } 18 } 19 bool is_prim(int n) 20 { 21 int i; 22 for(i = 2; i * i <= n; i++) 23 { 24 if(n % i == 0) return false; 25 } 26 return true; 27 } 28 int calsum(int n) 29 { 30 int tsum = 0; 31 while(n) 32 { 33 tsum += (n % 10); 34 n /= 10; 35 } 36 return tsum; 37 } 38 int cal(int n) 39 { 40 int i; 41 int tsum = 0; 42 for(i = 0; i < num; i++) 43 { 44 if(n == 1) break; 45 while(n % prime[i] == 0) 46 { 47 int temp = prime[i]; 48 n /= prime[i]; 49 tsum += calsum(temp); 50 } 51 } 52 if(n != 1) tsum += calsum(n); 53 return tsum; 54 } 55 int main() 56 { 57 int i,j; 58 is_prime(); 59 int n; 60 while(scanf("%d",&n) != EOF) 61 { 62 if(!n) break; 63 i = n + 1; 64 while(1) 65 { 66 if(is_prim(i)) {i++; continue;} 67 if(calsum(i) == cal(i)) break; 68 i++; 69 } 70 cout<<i<<endl; 71 } 72 return 0; 73 }
题目:http://codeforces.com/problemset/problem/233/B
被上面误导了一下,我看标签写的是二分,数学,然后就写二分,可是写好了发现不对呀,根本就不是单调函数怎么可以分出结果呢,然后开始想枚举x,但是发现太大了,但是s(x) 最大是81,于是就枚举 s(x),这样就形成一个 x ^ 2 + b * x + (-n) = 0 2次方程,然后根据求根公式 x = (-b +(-) sqrt(b * b - 4 * a * c)) / 2 * a;然后求出 x,然后再判断
View Code
1 typedef long long ll; 2 ll cal(ll x) 3 { 4 ll temp = 0; 5 while(x) 6 { 7 temp += (x % 10); 8 x /= 10; 9 } 10 return temp; 11 } 12 int main() 13 { 14 ll n; 15 int i,flag; 16 while(cin>>n) 17 { 18 flag = 0; 19 for(i = 1; i <= 100; i++) 20 { 21 ll m = (sqrt((i * i + 4 * n) * 1.0) - i) / 2; 22 ll ans = cal(m); 23 if(cal(m) == i && m * m + i * m == n) 24 { 25 cout<<m<<endl;flag = 1;break; 26 } 27 } 28 if(!flag) printf("-1\n"); 29 } 30 return 0; 31 }