sdut 3258 第六屆山東省ACM省賽H題

2021-07-31 09:25:39 字數 958 閱讀 8764

題意:

乙個數可以表示為另乙個數的平方叫做square number,像3*3 = 9,9是乙個square number。

給定n個數,求有多少對(ai,bi)滿足ai×bi為乙個square number,其中i != j。

思路:

除1之外的任何乙個整數都可分解為有限個質數的乘積,所以可以推得兩個數分解為質因數乘積之後的乘積,只有滿足任意乙個質因數的個數為偶數個時,它們的乘積才為乙個square number,簡單來講就是平方數可以表示為若干個偶次冪的質數的乘積。所以對於乙個數的質因數,有偶數個,則忽略,奇數個,就表明仍需要乙個此質數,最後把所有的仍需要的質數的乘積記作now

記錄到乙個facade陣列裡,並ans += 之前的facade[now]即可。

但,還不夠,仍需要乙個優化,看**。

#include #include #include #include #include #define ll long long

using namespace std;

const int maxn = 1000000;

int prime[maxn+5]; //素數篩選

int facade[maxn+5]; //記錄之前的now有多少個

int main()

int n, t, k, ct, now;

scanf("%d", &t);

while(t--)

if(ct%2 == 1) now *= j; //質因數個數為奇數時,now *= j;

if(k == 1 || !prime[k])

}ans += facade[now];

++facade[now];

} printf("%lld\n", ans); //ans > int

} return 0;

}

繼續加油~

山東省第六屆省賽K題

題意描述 題目原型來自lol遊戲,乙個人和一座塔,共同打n個怪,每個怪都有一定的血量,塔和人都有無限血。每一 擊都是塔先打,而且塔只按順序打怪物,人後打,但人可以選擇任意乙個攻擊,但是人在每一輪可以攻擊也可以不攻擊。求人最多可以給幾個怪物以最後一擊。1 n 1000,塔,人的每次攻擊力x y 在 0...

第六屆山東省省賽題解

給出n個人的身高和體重 要求按身高排序後 奇數序號的人一隊,偶數序號的人一隊 體重大的一隊獲勝 水題,考察點是結構體的排序 要注意的是變數的初始化以及資料型別的精度和輸入 struct node a 110 bool cmp node a,node b intmain sort a,a n,cmp ...

第六屆浙江省賽題解(部分)

題目鏈結 題目大意 有n個投標者,投標最高的獲得物品,需要支付第二投標者的 解題思路 使用結構體,儲存投標的 和一開始的排序.然後根據投標 排序,使用sort就可以了 ac include include include include using namespace std const int m...