Prime Numbers

uva 294 - Divisors  求因子个数和

 1 #include<iostream>
2 #include<cstring>
3 #include <cstdio>
4 #include<string>
5 #include<queue>
6 #include<vector>
7 #include<map>
8 #include <set>
9 #include<hash_set>
10 #include<ctime>
11 #include<cmath>
12 #include <cstdlib>
13 #include<algorithm>
14 using namespace std;
15 #define MAX 510000
16 int num_prime,prime[MAX];
17 bool vis[MAX];
18 void get_prime() {
19 num_prime=0;
20 memset(vis,true,sizeof(vis));
21 prime[num_prime++]=2;
22 for(int i=3;i<MAX;i+=2){
23 if(vis[i]){
24 prime[num_prime++]=i;
25 for(int j=i+i;j<MAX;j+=i) vis[j]=false;
26 }
27 }
28 }
29 int get_divisors(int x){
30 if(x==1) return 1;
31 int sum=1;
32 for(int i=0;prime[i]*prime[i]<=x;i++){
33 int num=0;
34 while( !(x%prime[i]) ) { x/=prime[i]; num++; }
35 if(num) sum*=(num+1);
36 }
37 if(x!=1) sum*=2;
38 return sum;
39 }
40 int main(){
41 int a,b,T,x;
42 get_prime();
43 scanf("%d",&T);
44 while(T--){
45 scanf("%d%d",&a,&b); if(a>b) swap(a,b);
46 int ans=0,id;
47 for(int i=a;i<=b;i++){
48 if(ans<(x=get_divisors(i))) ans=x,id=i;
49 }
50 printf("Between %d and %d, %d has a maximum of %d divisors.\n",a,b,id,ans);
51 }
52 }


uva 10110 - Light, more light

hint 2^32-1会超int

 1 #include<iostream>
2 #include<cstring>
3 #include <cstdio>
4 #include<string>
5 #include<queue>
6 #include<vector>
7 #include<map>
8 #include <set>
9 #include<hash_set>
10 #include<ctime>
11 #include<cmath>
12 #include <cstdlib>
13 #include<algorithm>
14 using namespace std;
15 #define LL long long
16 #define PLIST 10000000
17 LL num_prime,prime[PLIST];
18 bool vis[PLIST];
19 void get_prime() {
20 num_prime=0;
21 memset(vis,true,sizeof(vis));
22 prime[num_prime++]=2;
23 for(LL i=3;i<PLIST;i+=2){
24 if(vis[i]){
25 prime[num_prime++]=i;
26 for(LL j=i+i;j<PLIST;j+=i) vis[j]=false;
27 }
28 }
29 }
30 //获取 x 的所有因子个数和 (包括1,x);
31 LL get_divisors(LL x){
32 if(x==1) return 1;
33 LL sum=1;
34 for(LL i=0;prime[i]*prime[i]<=x;i++){
35 LL num=0;
36 while( !(x%prime[i]) ) { x/=prime[i]; num++; }
37 if(num) sum*=(num+1);
38 }
39 if(x!=1) sum*=2;
40 return sum;
41 }
42 int main(){
43 LL n;
44 get_prime();
45 while(scanf("%lld",&n)&&n){
46 LL ans=get_divisors(n);
47 if(ans&1) printf("yes\n");
48 else printf("no\n");
49 }
50 }


uva 10006 - Carmichael Numbers 

快速幂应用  a^n%n=a 

 1 #include<iostream>
2 #include<cstring>
3 #include <cstdio>
4 #include<string>
5 #include<queue>
6 #include<vector>
7 #include<map>
8 #include <set>
9 #include<hash_set>
10 #include<ctime>
11 #include<cmath>
12 #include <cstdlib>
13 #include<algorithm>
14 using namespace std;
15 #define LL long long
16 #define PLIST 1000000
17 LL num_prime,prime[PLIST];
18 bool vis[PLIST];
19 void get_prime() {
20 num_prime=0;
21 memset(vis,true,sizeof(vis));
22 prime[num_prime++]=2;
23 for(LL i=3;i<PLIST;i+=2){
24 if(vis[i]){
25 prime[num_prime++]=i;
26 for(LL j=i+i;j<PLIST;j+=i) vis[j]=false;
27 }
28 }
29 }
30 LL pow_mod(LL a, LL n, LL m){
31 LL res;
32 if(n == 1) return a % m;
33 res = pow_mod(a, n>>1, m);
34 res = (res * res) % m;
35 if(n&1) return (res * a) % m;
36 else return res;
37 }
38 bool slove(LL n){
39 if(vis[n]) return 0;
40 for(LL i=2;i<n;i++){
41 if(pow_mod(i,n,n)!=i) return 0;
42 }
43 return 1;
44 }
45 int main(){
46 LL n;
47 get_prime();
48 while(scanf("%lld",&n)&&n){
49 if(slove(n)) printf("The number %lld is a Carmichael number.\n",n);
50 else printf("%lld is normal.\n",n);
51 }
52 }
posted @ 2012-03-23 23:03  HaoHua_Lee  阅读(244)  评论(0编辑  收藏  举报