zoukankan      html  css  js  c++  java
  • B. Strange Definition 题解(质因子分解+思维)

    题目链接

    题目思路

    其实问题就可以转化为(x*y)为平方数

    就是把每个数的偶数个数的因子都去除掉,去除后的相同的数认为是一类。

    然后最关键的是1秒后,类的大小为偶数的类,和全是1的类可以进行再次合并

    因为类的大小为偶数的类,一秒之后这个类里面的因子数量又变为偶数了

    代码

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-6;
    int n,q;
    int a[maxn];
    int p[maxn];
    int id[maxn];
    signed main(){
        id[1]=1;
        for(int i=2;i<=1e6;i++){
            int x=i;
            id[i]=1;
            while(p[x]){
                int now=p[x];
                int cnt=0;
                while(p[x]==now){
                    x=x/p[x];
                    cnt++;
                }
                if(cnt%2){
                    id[i]*=now;
                }
            }
            id[i]*=x;
            if(p[i]){// 自己不是质数
                continue;
            }
            for(int j=i;j<=1e6;j+=i){
                if(p[j]==0){
                    p[j]=i;
                }
            }
        }
        int _;scanf("%d",&_);
        while(_--){
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                a[i]=id[a[i]];
            }
            sort(a+1,a+1+n);
            int cnt=0;
            int ans=0,sum=0;
            for(int i=1;i<=n;i++){
                if(a[i]==a[i-1]){
                    cnt++;
                }else{
                    ans=max(ans,cnt);
                    if((cnt>0&&cnt%2==0)||a[i-1]==1){
                        sum+=cnt;
                    }
                    cnt=1;
                }
            }
            ans=max(ans,cnt);
            if((cnt>0&&cnt%2==0)||a[n]==1){
                sum+=cnt;
            }
            scanf("%d",&q);
            for(int i=1,x;i<=q;i++){
                scanf("%d",&x);
                if(x==0){
                    printf("%d
    ",ans);
                }else{
                    printf("%d
    ",max(ans,sum));
                }
            }
        }
    
        return 0;
    }
    
    
    不摆烂了,写题
  • 相关阅读:
    android SQLite使用
    蓝牙从搜索到成功配对的全过程
    vscode 开发.net core 从安装到部署 教程详解
    ServiceStack 简单服务搭建
    MongoDB 安装配置
    request.url 端口 错误
    Python 之 hello world
    .NET DateTime 源码学习
    Parallel.For 平行算法 使用
    Thread.Join 和 Task.Wait 方法
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15240505.html
Copyright © 2011-2022 走看看