「white shores, and beyond. a far green country under a swift sunrise.」--灰魔法師
給出長度為n的序列a, 求有多少對數對 (i, j) (1 <= i < j <= n) 滿足 ai + aj 為完全平方數。
第一行乙個整數 n (1 <= n <= 105)
第二行 n 個整數 ai (1 <= ai <= 105)
輸出乙個整數,表示滿足上述條件的數對個數。
示例1
複製
複製3
1 3 6
2
思路:首先能想到ai+aj最大和也就是2e5,同時2e5以內的平方數只有400多個,可以直接打表存下來,記為p[i]。
然後我們把每個a[i]做標記(同時統計個數),用p[i]去掃瞄a[i],已知p[1],令p[1]-ai,所得差即為另乙個數aj,如果能在a[i]裡找到(即a[j]被標記),說明這個平方和p[1]成立。複雜度o(1e2*1e5)。
接下來需要考慮兩種情況:
1。完全相同的數組合:2 2 2 此時方案是3,我們標記陣列應該是vis[2]=3,那麼都是相同的數字,任選兩個的方案數:c[3,2],即(n*(n-1))/2。
2.不同的數字組合:1 1 3 3 此時方案是4,標記陣列vis[1]=2,vis[3]=2,直接vis[1]*vis[3]就是方案數,由於重複計算(vis[3]*vis[1]),這個情況的答案需要/2,1情況不需要。
總之就是結果統計需要考慮相同數字的情況,情況就這兩種- -。
#include #define ll long long
using namespace std;
ll vis[100010],n,a[1010],pos,ans1,ans2;
ll ans;
int main()
ans1=ans2=0;
ll tmp;
for(ll i=1;i100000)continue; //不合法範圍
if(tmp<=0)break; //不合法
if(vis[tmp])}}
ans1=ans1+ans2/2;
printf("%lld\n",ans1);
}return 0;
}
牛客網Wannafly挑戰賽27 A 灰魔法師
white shores,and beyond.a far green country under a swift sunrise.灰魔法師 給出長度為n的序列a,求有多少對數對 i,j 1 i j n 滿足 ai aj 為完全平方數。第一行乙個整數 n 1 n 105 第二行 n 個整數 ai 1...
牛客Wannafly挑戰賽27 A 灰魔法師
感謝大佬 講解非常仔細 做題的時候也有想過去打表,然後就沒有了,還是沒有找到其中的規律。這裡補一條完全平方數的定義?這個數開根號後是整數如 9,25,36 因為題目資料是1e5,所以兩個數相加也只有2e5,從1到2e5滿足條件的完全平方數個數也只有400 就用乙個陣列去記錄下來,然後for迴圈把給出...
Wannafly挑戰賽A 概率DP
給你乙個長 n 的序列,m 次查詢 每次查詢給乙個 x,然後 從序列的最左端 1 開始,每次隨機的選擇乙個右端點 r,如果兩個端點間的區間和不超過 x 就進行一次分割,然後把左端點變成 r 1,否則一直隨機下去。問這樣分割出來的期望段數 第一行兩個數 n,m 之後一行 n 個數表示這個序列 之後m行...