傳送門
題意就是給出乙個長度為n<=1e5的序列和乙個k範圍[2,100],元素範圍[1,1e5]。求ai
aj=pow(x,k) ,x是任意的。
很容易想到用除過去map找,於是我就先預處理出每個數需要的最小數num,比如k=3時,2所需要的num就是4,因為24=8,num[12]是18因為12*18==pow(6,3)。這裡我是用質因數分解和快速冪做的。然後x就會是num[aj]*pow(列舉的數,k),因為是次冪所以列舉不會很多,在logn的範圍。
複雜度在nloglog左右?
跑了1.7s,還是挺懸的
搜了下其他人的解法,不用用到快速冪,質因數分解也很快。
大概就是質因數次方k模一下k,然後map.find(k-次方)
跑了一下只用了90+ms
別人家的解法
#include
using namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;
typedef pair pll;
const
int maxn =
1e5+5;
const ll inf =
0x3f3f3f3f
;const ll mod =
1e9+7;
#define all(x) x.begin(), x.end()
int prime[maxn]
, vis[maxn]
;ll num[maxn]
;int n, k;
ll ksm
(ll a, ll n)if(
log10
(a)>5)
return-1
; a = a * a;
n >>=1;
}return ans;
}void
init()
}for
(int i =
2; i < maxn;
++i)
num[i]*=
ksm(prime[j]
,(cnt + k -1)
/ k * k - cnt);if
(num[i]
<0)
}}}int
main()
mapint> mp;
ll ans =0;
for(
int i =
0; i < n;
++i)
if(mp.
count
(temp * num[a[i]])
) ans +
= mp[temp * num[a[i]]]
;}mp[a[i]]++
;}cout << ans << endl;
return0;
}
每日一練4
員工表emp 員工編號eid,姓名ename,工作職位title,僱傭日期hiretime,工資salary,獎金bonus,部門depart 部門表dept 部門編號did,名稱dname,部門領導leader 員工資料 1001,張三 銷售 1999 12 1 3000.0,1100.0,102...
每日一練25
請描述 mysql 從安裝到配置的全部詳細過程 確保一台新電腦可以順利使用 mysql mysql安裝嚮導啟動,按 next 繼續 選擇安裝型別,有 typical 預設 complete 完全 custom 使用者自定義 三個選項,我們選擇 custom 有更多的選項,也方便熟悉安裝過程 選擇配置...
每日一練 13
談談你對ajax 的理解?概念 特點 作用 select 教師號,sum case when 星期號 1 and 是否有課 有 then 1 else 0 end as 星期一,sum case when 星期號 2 and 是否有課 有 then 1 else 0 end as 星期二,sum c...