• 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 }
  • 相关阅读:
    C#实现注册码
    多表链接 Left join
    Repeater 一行显示两列数据
    Repeater一行显示数据库中多行表记录
    HP QC(Quality Center)在Windows 7 IE8 IE9下不能工作解决方案
    Android应用换肤总结
    Lua 第一个应用程序 Hello World
    JNI 技术与 Android 应用
    NSAutoreleasePool' is unavailable: not avail
    1-2基础控件
  • 原文地址:https://www.cnblogs.com/savennist/p/12252364.html
Copyright © 2020-2023  润新知