CF1497E1 Square-free division (easy version)
CF1497E1 Square-free division (easy version)
題意:
這是簡單版,此題中 k=0
給出一串長為 n 的序列 a1,a2,a3...ana_1,a_2,a_3...a_na1?,a2?,a3?...an?
把它分成盡量少的塊使每一塊中任意兩數(shù)的乘積不是一個完全平方數(shù)。
輸出最少的塊數(shù)。
題解:
本題是不涉及修改的
其實好想,對于所有數(shù)質(zhì)因子分解,如果任意兩個數(shù)的乘積是一個完全平方數(shù),兩個數(shù)的質(zhì)因子合并后,均為偶數(shù)個,因為偶數(shù)個就可以被開方掉,說明是平方數(shù)
那么我們可以這樣,對于每個數(shù)aia_iai?,我們對其質(zhì)因子分解,將出現(xiàn)偶數(shù)次的質(zhì)因子刪去,只保留奇數(shù)次的質(zhì)因子,就比如質(zhì)因子7出現(xiàn)了5次,那我們只保留一個質(zhì)因子7。這樣是因為兩個數(shù)的乘積,只需要考慮出現(xiàn)奇數(shù)次的情形
這樣處理過后的數(shù)組a,如果存在i,ji,ji,j使得ai==aja_i==a_jai?==aj?,那么就說明這兩個數(shù)會組成完全數(shù),不能在一個塊內(nèi)
剩下就好做了,直接循環(huán)一邊,對于第二次出現(xiàn)的數(shù)就建立新塊
代碼:
// 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 #elsestartTime= clock();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= 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;}elsemp[a[i]]= 1;}ans++;cout << ans << endl;}return 0;;//Time_test(); }總結(jié)
以上是生活随笔為你收集整理的CF1497E1 Square-free division (easy version)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浆细胞性乳腺炎是什么病
- 下一篇: CF1497E2 Square-free