首页 > 其他 > 详细

数学专题

时间:2015-10-31 00:23:05      阅读:406      评论:0      收藏:0      [点我收藏+]

素数,整数分解,欧拉函数 

1.poj 1365

题目给出num分解成几个素数相乘的形式,求num-1分解的形式

pow用的有点233

技术分享
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 typedef long long ll;
 13 #define cl(a) memset(a,0,sizeof(a))
 14 #define ts printf("\n*****\n");
 15 #define sc(a) scanf("%d",&a);
 16 #define pt(a) printf("%d\n",a);
 17 #define ff for(i=0;i<n;i++)
 18 #define fff for(i=0;i<n;i++) for(j=0;j<n;j++)
 19 const int MAXN=100005;
 20 
 21 //define single variable
 22 
 23 int n,m,tt;
 24 int ans,sum1,sum2,tot,Max;
 25 
 26 
 27 //define arrays
 28 int a[MAXN],b[MAXN];
 29 char s[MAXN];
 30 int vis[MAXN];
 31 //define struct
 32 struct Node
 33 {
 34     int x,y;
 35     Node(){}
 36     /*Node(int xx,int yy,int tt)
 37     {
 38 
 39     }*/
 40     void in()
 41     {
 42         scanf("%d%d",&x,&y);
 43     }
 44 }node[MAXN];
 45 
 46 //others
 47 bool cmp(Node a,Node b)
 48 {
 49     return a.y>b.y;
 50 }
 51 int prime[MAXN+1];
 52 void getPrime()
 53 {
 54 memset(prime,0,sizeof(prime));
 55 for(int i=2;i<=MAXN;i++)
 56 {
 57 if(!prime[i])prime[++prime[0]]=i;
 58 for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
 59 {
 60 prime[prime[j]*i]=1;
 61 if(i%prime[j]==0) break;
 62 }
 63 }
 64 }
 65 long long factor[100][2];
 66 int fatCnt;
 67 int getFactors(long long x)
 68 {
 69 fatCnt=0;
 70 long long tmp=x;
 71 for(int i=1;prime[i]<=tmp/prime[i];i++)
 72 {
 73 factor[fatCnt][1]=0;
 74 if(tmp%prime[i]==0)
 75 {
 76 factor[fatCnt][0]=prime[i];
 77 while(tmp%prime[i]==0)
 78 {
 79 factor[fatCnt][1]++;
 80 tmp/=prime[i];
 81 }
 82 fatCnt++;
 83 }
 84 }
 85 if(tmp!=1)
 86 {
 87 factor[fatCnt][0]=tmp;
 88 factor[fatCnt++][1]=1;
 89 }
 90 return fatCnt;
 91 }
 92 void init()
 93 {
 94     ans=0,sum1=0,sum2=0,tot=0,Max=0;
 95     //cl(vis);
 96     //cl(node);
 97 }
 98 
 99 void fun(int x)
100 {
101     int num=getFactors((ll)x);
102     printf("%lld %lld",factor[num-1][0],factor[num-1][1]);
103     for(int i=num-2;i>=0;i--)
104     {
105         printf(" %lld %lld",factor[i][0],factor[i][1]);
106     }
107     printf("\n");
108 }
109 int main()
110 {
111     int i,j,k,ca=1;
112     #ifndef ONLINE_JUDGE
113     freopen("1.in","r",stdin);
114     #endif
115     getPrime();
116     /*scanf("%d",&tt);
117     while(tt--)
118     {
119     //printf("Case %d: ",ca++);
120         init();
121     }*/
122     char ch;
123     while(scanf("%c",&ch)!=EOF)
124     {
125         init();
126         if(ch==0)
127         {
128             break;
129         }
130         ans=ch-0;
131         double sum=1;
132         bool flag=0;    //底数输入
133         while(1)
134         {
135             scanf("%c",&ch);
136             if(ch==\n)
137             {
138                 sum*=pow((double)ans,(double)tot);
139                 fun((int)sum-1);
140                 sum=1,ans=0,tot=0;
141                 break;
142             }
143             else if(ch== &&flag==0)
144             {
145                 flag=1;
146             }
147             else if(ch== &&flag==1)
148             {
149                 sum*=pow(ans,tot);
150                 ans=0;
151                 tot=0;
152                 flag=0;
153             }
154             else if(flag==0)
155             {
156                 ans=ans*10+(ch-0);
157             }
158             else if(flag==1)
159             {
160                 tot=tot*10+(ch-0);
161             }
162         }
163     }
164 }
View Code

2.poj 1365

给出一段范围和一个deep,对于任何长度为i(i<=deep)的一段连续数字都为合数,求字典序最小的一段

一开始以为可以直接贪心填,后来发现不一定,改用dfs

技术分享
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 typedef long long ll;
 13 #define cl(a) memset(a,0,sizeof(a))
 14 #define ts printf("\n*****\n");
 15 #define sc(a) scanf("%d",&a);
 16 #define pt(a) printf("%d\n",a);
 17 #define ff for(i=0;i<n;i++)
 18 #define fff for(i=0;i<n;i++) for(j=0;j<n;j++)
 19 const int MAXN=1005;
 20 
 21 //define single variable
 22 
 23 int n,m,tt;
 24 int ans[MAXN],sum[MAXN],sum1,sum2,tot,Max;
 25 bool notprime[1000010];//值为false表示素数,值为true表示非素数
 26 void Init()
 27 {
 28 memset(notprime,false,sizeof(notprime));
 29 notprime[0]=notprime[1]=true;
 30 for(int i=2;i<1000010;i++)
 31 if(!notprime[i])
 32 {
 33 if(i>1000010/i)continue;//防止后面i*i溢出(或者i,j用long long)
 34 //直接从i*i开始就可以,小于i倍的已经筛选过了,注意是j+=i
 35 for(int j=i*i;j<1000010;j+=i)
 36 notprime[j]=true;
 37 }
 38 }
 39 
 40 //define arrays
 41 int a[MAXN],b[MAXN];
 42 char s[MAXN];
 43 int vis[MAXN];
 44 
 45 void init()
 46 {
 47     sum1=0,sum2=0,tot=0,Max=0;
 48     cl(vis);
 49     cl(sum);
 50     cl(ans);
 51 }
 52 int l1,l2,deep,num;
 53 bool kk=0;
 54 void dfs(int pos)
 55 {
 56     if(kk)  return;
 57     if(pos==num+1)
 58     {
 59         kk=1;
 60         for(int i=1;i<=num;i++)
 61         {
 62             ans[i]=a[i];
 63         }
 64         return;
 65     }
 66     for(int i=l1;i<=l2;i++)
 67     {
 68         if(!vis[i])
 69         {
 70             int flag=1;
 71             for(int j=deep;j>=2;j--)
 72             {
 73                 if(!notprime[i+sum[pos-1]-sum[pos-j]])
 74                 {
 75                     flag=0;
 76                     break;
 77                 }
 78             }
 79             if(!flag)   continue;
 80             sum[pos]=sum[pos-1]+i;
 81             vis[i]=1;
 82             a[pos]=i;
 83             dfs(pos+1);
 84             vis[i]=0;
 85         }
 86     }
 87 }
 88 int main()
 89 {
 90     int i,j,k,ca=1;
 91     #ifndef ONLINE_JUDGE
 92     freopen("1.in","r",stdin);
 93     #endif
 94     Init();
 95     while(scanf("%d%d%d",&l1,&l2,&deep)!=EOF&&l1&&l2&&deep)
 96     {
 97         init();
 98         kk=0;
 99         num=l2-l1+1;
100         for(i=l1;i<=l2;i++)
101         {
102             vis[i]=1;
103             a[1]=i;
104             sum[1]=i;
105             dfs(2);
106             vis[i]=0;
107             if(kk)  break;
108         }
109         if(kk)
110         {
111             printf("%d",ans[1]);
112             for(i=2;i<=num;i++)
113             {
114                 printf(",%d",ans[i]);
115             }
116             printf("\n");
117         }
118         else puts("No anti-prime sequence exists.");
119     }
120     return 0;
121 }
View Code

 

数学专题

原文:http://www.cnblogs.com/cnblogs321114287/p/4924660.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!