CF1497E1 Square-free division (easy version)

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1497E1 Square-free division (easy version)相关的知识,希望对你有一定的参考价值。

CF1497E1 Square-free division (easy version)

题意:

这是简单版,此题中 k=0
给出一串长为 n 的序列 a 1 , a 2 , a 3 . . . a n a_1,a_2,a_3...a_n a1,a2,a3...an
把它分成尽量少的块使每一块中任意两数的乘积不是一个完全平方数。
输出最少的块数。

题解:

本题是不涉及修改的
其实好想,对于所有数质因子分解,如果任意两个数的乘积是一个完全平方数,两个数的质因子合并后,均为偶数个,因为偶数个就可以被开方掉,说明是平方数
那么我们可以这样,对于每个数 a i a_i ai,我们对其质因子分解,将出现偶数次的质因子删去,只保留奇数次的质因子,就比如质因子7出现了5次,那我们只保留一个质因子7。这样是因为两个数的乘积,只需要考虑出现奇数次的情形
这样处理过后的数组a,如果存在 i , j i,j i,j使得 a i = = a j a_i==a_j ai==aj,那么就说明这两个数会组成完全数,不能在一个块内
剩下就好做了,直接循环一边,对于第二次出现的数就建立新块

代码:

// Problem: E1. Square-free division (easy version)
// Contest: Codeforces Round #708 (Div. 2)
// URL: https://codeforces.com/contest/{getProblemIndexes(problemCurrentPageList[i][0])[0]}/problem/E1
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// By Jozky

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
    x= 0;
    char c= getchar();
    bool flag= 0;
    while (c < '0' || c > '9')
        flag|= (c == '-'), c= getchar();
    while (c >= '0' && c <= '9')
        x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
    if (flag)
        x= -x;
    read(Ar...);
}
template <typename T> inline void write(T x)
{
    if (x < 0) {
        x= ~(x - 1);
        putchar('-');
    }
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
    startTime= clock();
    freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
    endTime= clock();
    printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 2e5 + 9;
int a[maxn];
int main()
{
    //rd_test();
    int t;
    read(t);
    while (t--) {
        int n, k;
        cin >> n >> k;
        int tot= 0;
        for (int i= 1; i <= n; i++) {
            cin >> a[i];
            int now= a[i];
            for (int j= 2; j * j <= now; j++) {
                int cnt= 0;
                while (now % j == 0) {
                    now/= j;
                    cnt++;
                }
                for (int k= 1; k <= cnt; k++)
                    a[i]/= j;
                if (cnt % 2 == 1)
                    a[i]*= j;
            }
        }
        // for (int i= 1; i <= n; i++)
        // cout << "a[i]=" << a[i] << endl;
        map<int, int> mp;
        int ans= 0;
        for (int i= 1; i <= n; i++) {
            if (mp[a[i]]) {
                ans++;
                mp.clear();
                mp[a[i]]= 1;
            }
            else
                mp[a[i]]= 1;
        }
        ans++;
        cout << ans << endl;
    }
    return 0;;
    //Time_test();
}

以上是关于CF1497E1 Square-free division (easy version)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 1497E2 Square-free division (hard version)(dp+数论)

CF1108E1 Array and Segments (Easy version)(待更新)

cf 1216e1

cf 1015 E1. Stars Drawing (Easy Edition)

CF1005E1 Median on Segments (Permutations Edition) 思维

CF1335E1 Three Blocks Palindrome (easy version)