zoukankan      html  css  js  c++  java
  • 数学专题

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

    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("
    *****
    ");
     15 #define sc(a) scanf("%d",&a);
     16 #define pt(a) printf("%d
    ",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("
    ");
    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=='
    ')
    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("
    *****
    ");
     15 #define sc(a) scanf("%d",&a);
     16 #define pt(a) printf("%d
    ",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("
    ");
    117         }
    118         else puts("No anti-prime sequence exists.");
    119     }
    120     return 0;
    121 }
    View Code

    3.poj 2739

    给出一个数,问能有几种连续素数和形式表示的方式,求一下前缀和,然会枚举首尾即可

      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("
    *****
    ");
     15 #define sc(a) scanf("%d",&a);
     16 #define pt(a) printf("%d
    ",a);
     17 #define ptn printf("
    ");
     18 #define ff for(i=0;i<n;i++)
     19 #define fff for(i=0;i<n;i++) for(j=0;j<n;j++)
     20 const int MAXN=10005;
     21 
     22 //define single variable
     23 
     24 int n,m,tt;
     25 int ans,sum[MAXN],sum1,sum2,tot,Max;
     26 
     27 
     28 //define arrays
     29 int a[MAXN],b[MAXN];
     30 char s[MAXN];
     31 int vis[MAXN];
     32 //define struct
     33 struct Node
     34 {
     35     int x,y;
     36     Node(){}
     37     /*Node(int xx,int yy,int tt)
     38     {
     39 
     40     }*/
     41     void in()
     42     {
     43         scanf("%d%d",&x,&y);
     44     }
     45 }node[MAXN];
     46 
     47 //others
     48 bool cmp(Node a,Node b)
     49 {
     50     return a.y>b.y;
     51 }
     52 
     53 int prime[MAXN+1];
     54 void getPrime()
     55 {
     56 memset(prime,0,sizeof(prime));
     57 for(int i=2;i<=MAXN;i++)
     58 {
     59 if(!prime[i])prime[++prime[0]]=i;
     60 for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
     61 {
     62 prime[prime[j]*i]=1;
     63 if(i%prime[j]==0) break;
     64 }
     65 }
     66 }
     67 
     68 void init()
     69 {
     70     ans=0,sum1=0,sum2=0,tot=0,Max=0;
     71     //cl(vis);
     72 }
     73 
     74 
     75 int main()
     76 {
     77     int i,j,k,ca=1;
     78     #ifndef ONLINE_JUDGE
     79     freopen("1.in","r",stdin);
     80     #endif
     81 
     82     /*scanf("%d",&tt);
     83     while(tt--)
     84     {
     85     //printf("Case %d: ",ca++);
     86         init();
     87     }*/
     88     getPrime();
     89     sum[0]=0;
     90     for(i=1;i<=prime[0];i++)
     91         {
     92             sum[i]=sum[i-1]+prime[i];
     93         }
     94     while(scanf("%d",&n)!=EOF&&n)
     95     {
     96         //printf("Case %d: ",ca++);
     97         init();
     98         for(i=0;i<prime[0];i++)
     99         {
    100             for(j=i+1;j<=prime[0];j++)
    101             {
    102                 if(sum[j]-sum[i]==n)    ans++;
    103             }
    104         }
    105         pt(ans);
    106     }
    107 }
    View Code

     4.poj 1595

    给出一个数,需要你求出其区间中的所有素数,然后再分素数个数的奇偶性,从素数列表的中间开始输出即可!二分找素数个数,然后确定起点位置输出即可

      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("
    *****
    ");
     15 #define sc(a) scanf("%d",&a);
     16 #define pt(a) printf("%d
    ",a);
     17 #define ptn printf("
    ");
     18 #define ff for(i=0;i<n;i++)
     19 #define fff for(i=0;i<n;i++) for(j=0;j<n;j++)
     20 const int MAXN=10005;
     21 
     22 //define single variable
     23 
     24 int n,m,tt;
     25 int ans,sum[MAXN],sum1,sum2,tot,Max;
     26 
     27 
     28 //define arrays
     29 int a[MAXN],b[MAXN];
     30 char s[MAXN];
     31 int vis[MAXN];
     32 //define struct
     33 struct Node
     34 {
     35     int x,y;
     36     Node(){}
     37     /*Node(int xx,int yy,int tt)
     38     {
     39 
     40     }*/
     41     void in()
     42     {
     43         scanf("%d%d",&x,&y);
     44     }
     45 }node[MAXN];
     46 
     47 //others
     48 bool cmp(Node a,Node b)
     49 {
     50     return a.y>b.y;
     51 }
     52 
     53 int prime[MAXN+1];
     54 void getPrime()
     55 {
     56 memset(prime,0,sizeof(prime));
     57 for(int i=2;i<=MAXN;i++)
     58 {
     59 if(!prime[i])prime[++prime[0]]=i;
     60 for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
     61 {
     62 prime[prime[j]*i]=1;
     63 if(i%prime[j]==0) break;
     64 }
     65 }
     66 }
     67 
     68 void init()
     69 {
     70     ans=0,sum1=0,sum2=0,tot=0,Max=0;
     71     //cl(vis);
     72 }
     73 
     74 
     75 int main()
     76 {
     77     int i,j,k,ca=1;
     78     #ifndef ONLINE_JUDGE
     79     freopen("1.in","r",stdin);
     80     #endif
     81 
     82     /*scanf("%d",&tt);
     83     while(tt--)
     84     {
     85     //printf("Case %d: ",ca++);
     86         init();
     87     }*/
     88     getPrime();
     89     sum[0]=0;
     90     prime[0]=1;
     91     int c;
     92     while(scanf("%d%d",&n,&c)!=EOF&&n)
     93     {
     94         printf("%d %d:",n,c);
     95         init();
     96         int w=lower_bound(prime,prime+1229,n+1)-prime;
     97         //pt(w)
     98         if(w%2)
     99         {
    100             int temp=c*2-1;
    101             for(i=((w+1)/2)-c>=0?((w+1)/2)-c:0;i<w&&temp>0;i++,temp--)
    102             {
    103                 printf(" %d",prime[i]);
    104             }
    105         }
    106         else
    107         {
    108             int temp=c*2;
    109             for(i=(w/2)-c>=0?(w/2)-c:0;i<w&&temp>0;i++,temp--)
    110             {
    111                 printf(" %d",prime[i]);
    112             }
    113         }
    114         ptn
    115         ptn
    116     }
    117 }
    View Code
  • 相关阅读:
    许可管理工具
    浅谈MapControl控件和PageLayoutControl控件
    通过Bresenham算法实现完成矢量线性多边形向栅格数据的转化
    四叉树算法原理与实现
    OC系列foundation Kit基础-NSNumber
    OC系列foundation Kit基础-NSdictionary
    OC系列foundation Kit基础-NSMutableArray
    OC系列foundation Kit基础-NSArray
    OC系列foundation Kit基础-NSMutableString
    OC系列foundation Kit基础-NSString
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4924660.html
Copyright © 2011-2022 走看看