zoukankan      html  css  js  c++  java
  • UVA1635-唯一分解定理的基本应用2

    原题:https://vjudge.net/problem/UVA-1635

    这是一个极其典型的“从素因子角度出发”的题目,下面是我的代码:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 
     8 const int maxn = 1e5 + 10;
     9 int md[100],mz[100];
    10 int ans[maxn];
    11 int n,m,lenth;
    12 int c[100];
    13 
    14 bool check(int n,int i)
    15 {
    16     int x=n-i;
    17     int y=i;
    18     for(int k=0;k<lenth;k++)
    19     {
    20         int p=md[k];
    21         while(x%p==0)
    22         {
    23             x/=p;
    24             c[k]++;
    25         }
    26         while(y%p==0)
    27         {
    28             y/=p;
    29             c[k]--;
    30         }//上下两个循环不能合并,因为这是一个递增积累过程,
    31     }//也正因如此才需要额外开辟一个数组c.
    32     for(int k=0;k<lenth;k++)
    33         if(c[k]<mz[k])return false;
    34     return true;
    35 }
    36 
    37 int factor()
    38 {//用来分解m
    39     memset(md,0,sizeof(md));
    40     memset(mz,0,sizeof(mz));
    41     int c=m,cur=0;
    42     int p=sqrt(c);
    43     for(int i=2;i<=p;i++)
    44     {
    45         bool ok=false;
    46         while(c%i==0)
    47         {
    48             md[cur]=i;
    49             mz[cur]++;
    50             c/=i;
    51             ok=true;
    52         }
    53         if(ok)cur++;
    54         if(c==1)break;
    55     }
    56     if(c>1)md[cur]=c,mz[cur]=1,cur++;
    57     return cur;
    58 }
    59 
    60 int main()
    61 {
    62     //freopen("input.txt","r",stdin);
    63     //freopen("text.txt","w",stdout);
    64     while(cin>>n>>m)
    65     {
    66         lenth=factor();//一开始忘记了记录lenth
    67         int cnt=0;
    68         memset(c,0,sizeof(c));
    69         //
    70         for(int i=1;i<n-1;i++)
    71             if(check(n,i))ans[cnt++]=i+1;
    72         printf("%d
    ",cnt);
    73         for(int i=0;i<cnt;i++)
    74         {
    75             if(i>0)printf(" ");
    76             printf("%d",ans[i]);
    77         }
    78         printf("
    ");
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    PetShop数据访问层之消息处理 《解剖PetShop》系列之三
    正则过滤汉字
    c语言 断点续传3
    c 写cgi 与socket通信
    C 语言 断点续传2
    承接B2C商城定制开发 空间+域名+风语商城系统=¥4000
    16进制 SQL注入
    c# socket传送大文件
    c写cgi cookies 设置与读取
    cgi 操作封装
  • 原文地址:https://www.cnblogs.com/savennist/p/12252364.html
Copyright © 2011-2022 走看看