zoukankan      html  css  js  c++  java
  • 质数素因子分解+欧筛+负数

    Mysterious Bacteria LightOJ - 1220

    题目大意:给你一个整数n(可能为负数),让你求满足a^p=n的最大的p
    思路:当n是正数时,直接对n进行素因子分解,在对它的素因子的个数进行gcd,比如12=2^2*3,gcd(2,1)就是最大的p;
    当n是负数时,则p的值一定是奇数,因为一个数的偶数次方一定为整数,因此需要将它的素因子个数全都化为奇数。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N=200000;
     5 int p[N],c[N];
     6 
     7 void init() {
     8     int num=1;
     9     memset(c,0,sizeof(c));
    10     for(int i=2; i<=N; i++) {
    11         if(c[i]==0)
    12           p[num++]=i;
    13         for(int j=1; j<num&&i*p[j]<=N; j++) {
    14             c[i*p[j]]=1;
    15 
    16             if(i%p[j]==0)
    17                 break;
    18         }
    19     }
    20 }
    21 
    22 const int M=35;
    23 int a[M],b[M],num;
    24 void factor(long long n) {
    25     memset(a,0,sizeof(a));
    26     memset(b,0,sizeof(b));
    27     num=1;
    28     int  temp=int(double(sqrt(n))+1);
    29     for(int i=1; p[i]<=temp; i++) {
    30         if(n%p[i]==0) {
    31             a[num++]=p[i];
    32             while(n%p[i]==0) {
    33                 b[num-1]++;
    34                 n/=p[i];
    35             }
    36         }
    37 
    38     }
    39     if(n!=1)
    40     {
    41         a[num]=n;
    42         b[num]=1;
    43     }
    44 }
    45 int gcd(int a,int b)
    46 {
    47 return b==0?a:gcd(b,a%b);
    48 }
    49 int main()
    50 {
    51     init();
    52     int T,po;
    53     long long n;
    54     scanf("%d",&T);
    55     int u=T;
    56     while(T--)
    57     {
    58         int flag=1;
    59     scanf("%lld",&n);
    60     if(n==1){cout<<"Case "<<u-T<<": "<<1<<endl;continue;}
    61 
    62     if(n<0)n=-n,flag=0;
    63 
    64     factor(n);
    65     po=b[1];
    66     if(flag)
    67     for(int i=2;i<num;i++)
    68     {
    69     po=gcd(po,b[i]);
    70     }
    71 
    72     if(!flag){
    73 
    74         if(po%2==0){while(po%2==0)po/=2;}
    75         for(int i=2;i<num;i++)
    76          {
    77              if(b[i]%2==0){while(b[i]%2==0)b[i]/=2;}
    78            po=gcd(po,b[i]);
    79          }
    80     }
    81     if(b[num])po=gcd(po,b[num]);
    82     if(flag)cout<<"Case "<<u-T<<": "<<po<<endl;
    83     else if(po%2==1)cout<<"Case "<<u-T<<": "<<po<<endl;
    84     else cout<<"Case "<<u-T<<": "<<1<<endl;
    85     }
    86 }
  • 相关阅读:
    windows下运行命令行mysql,提示mysql不是内部命令,解决办法
    XML和HTML的区别
    BZOJ4695 最假女选手(势能线段树)
    BZOJ5312 冒险(势能线段树)
    洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
    区间子集最大/最小异或和问题(线性基,树上差分)
    线性基模板(线性基)
    分数模板(C++模板)
    洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
    组合数学知识要点
  • 原文地址:https://www.cnblogs.com/lhsghhqgmzy/p/10772669.html
Copyright © 2011-2022 走看看