zoukankan      html  css  js  c++  java
  • CodeForces 154B- Colliders

       预处理...由于10^5<2^20..所以每个数的质因子个数最多20个..为了避免重复运算..将素有数的质因子打表出来...

       两个数如果互质..那么他们的最大公约数为1..反过来说..两个数如果不互质..那么他们的必定有相同的质因子...

       问题就简单了....由于要保证不冲突..所以每个质因子至多对应一个数...用w[i]记录一个数对应的数..w[i]==0说明其没用对应的数...

       那么如果要+k..则先判断其质因子上是否已经有其他的数了..如果没有..将其质因子w[i]=k (i为k的所有质因子)..删除一个数..将其所有的质因子w[i]=0...

       练习赛的时候2B了..把约数表打错了!!搞得一直过不了....


    Pragram:

    #include<iostream> 
    #include<stack>
    #include<queue>
    #include<stdio.h>
    #include<algorithm> 
    #include<string.h>
    #include<cmath>
    #define ll long long
    #define oo 1000000007
    #define MAXN 100005
    using namespace std;  
    int used[MAXN],Prime[MAXN],w[MAXN],N[MAXN],T[MAXN][30]; 
    char c;
    bool A[MAXN],P[MAXN];
    bool IsPrime(int x)
    {
          for (int i=2;i*i<=x;i++)
             if (x%i==0) return false;
          return true; 
    }
    void PreWork()
    {
          int i,num,x,k;
          num=0;
          memset(P,false,sizeof(P));
          for (i=2;i<=100000;i++)
             if (IsPrime(i)) Prime[++num]=i,P[i]=true;
          memset(N,0,sizeof(N));
          for (i=2;i<=100000;i++)
          { 
                k=i;
                for (x=1;Prime[x]*Prime[x]<=k;x++)
                  if (k%Prime[x]==0)
                  {
                       T[i][++N[i]]=Prime[x];
                       while (k%Prime[x]==0) k/=Prime[x]; 
                  }
                if (P[k]) T[i][++N[i]]=k;
          } 
    }
    int main()
    {
          int x,y,n,m,i;  
          PreWork(); 
          while (~scanf("%d%d",&n,&m))
          {
                 memset(A,false,sizeof(A)); 
                 memset(w,0,sizeof(w));
                 while (m--)
                 {
                       c=getchar();
                       while (c!='+' && c!='-') c=getchar();
                       scanf("%d",&x);
                       if (c=='+')
                       {
                             if (A[x]) printf("Already on
    "); 
                                else
                             {
                                    for (i=1;i<=N[x];i++)
                                       if (w[T[x][i]]) break;
                                    if (i<=N[x]) printf("Conflict with %d
    ",w[T[x][i]]);
                                      else 
                                      {
                                            printf("Success
    "),A[x]=true;
                                            for (i=1;i<=N[x];i++) w[T[x][i]]=x; 
                                      }
                             }                          
                       }else
                       {
                             if (!A[x]) printf("Already off
    "); 
                                else    
                                {
                                       printf("Success
    ");
                                       for (i=1;i<=N[x];i++) w[T[x][i]]=0;   
                                }
                             A[x]=false;
                       }
                 }
          } 
          return 0;
    }
    


  • 相关阅读:
    java 编码问题
    关于时间
    页面
    关于微信
    01-jQuery的介绍
    15-BOM
    14-定时器
    13-JS中的面向对象
    12-关于DOM操作的相关案例
    购物车练习
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3206465.html
Copyright © 2011-2022 走看看