Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <set>
- #include <cstring>
- #include <cstdlib>
- #include <map>
- #define f first
- #define s second
- #define ll long long
- #define ull unsigned long long
- #define mk make_pair
- #define pb push_back
- #define vi vector <int>
- #define pii pair<int , int>
- using namespace std;
- const int N = int(1e6) + 100;
- int a[N],lp[N],n;
- vector <pii > v[N];
- bool u[N];
- int m,p,x,cn,q[20],d[20];
- ll t,pq;
- ll ans = 0;
- void rec(int p,ll s){
- if(s > x) return;
- if(p == cn + 1){
- if(s == x) return;
- pq = t / s;
- if(pq > N - 1) return;
- if(u[s] && u[pq]) ans++;
- return;
- }
- ll res = 1;
- for(int i=0;i<=d[p];i++){
- if(res * s > x) return;
- rec(p+1,s * res);
- res = res * q[p];
- }
- }
- int main () {
- for(int i=2;i<=N;i+=2) lp[i] = 2;
- int K = int(sqrt( N + 1));
- for(int i=3;i<=K;i+=2) if(!lp[i]){
- for(int j=i*i;j<=N;j+=(i+i)){
- if(!lp[j]) lp[j] = i;
- }
- }
- for(int i=3;i<=N;i+=2) if(!lp[i]){
- lp[i] = i;
- }
- for(int i=2;i<=N;i++){
- m = i;
- p = lp[i];
- x = 0;
- while(m % p == 0){
- m /= p;
- x++;
- }
- v[i].pb(mk(p,x));
- for(int j=0;j<v[m].size();j++){
- v[i].pb(v[m][j]);
- }
- }
- scanf("%d",&n);
- for(int i=1;i<=n;i++){
- scanf("%d",&a[i]);
- u[a[i]] = 1;
- }
- for(int i=2;i<=n;i++){
- x = a[i];
- cn = 0;
- reverse(v[x].begin(),v[x].end());
- for(int j=0;j<v[x].size();j++){
- q[++cn] = v[x][j].f;
- d[cn] = 2*v[x][j].s;
- }
- t = 1ll*x*x;
- rec(1,1);
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement