1. 程式人生 > >【題解】LightOJ1236 Pairs Forming LCM 唯一分解定理+線性篩

【題解】LightOJ1236 Pairs Forming LCM 唯一分解定理+線性篩

題目連結
這裡寫圖片描述

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case starts with a line containing an integer n (1 ≤ n ≤ 1014).

Output

For each case, print the case number and the value returned by the function ‘pairsFormLCM(n)’.

Sample Input

15

2

3

4

6

8

10

12

15

18

20

21

24

25

27

29

Sample Output

Case 1: 2

Case 2: 2

Case 3: 3

Case 4: 5

Case 5: 4

Case 6: 5

Case 7: 8

Case 8: 5

Case 9: 8

Case 10: 8

Case 11: 5

Case 12: 11

Case 13: 3

Case 14: 4

Case 15: 2

對於每個素因子p,答案累加2*e+1,其中e是p的指數

#include<cstdio>
#include<cstring>
typedef long long ll; const int N=1e7+100; int t,p,cnt; ll prime[N/10]; bool iscomp[N]; ll n,ans; void primetable() { p=0; for(int i=2;i<N;i++) { if(!iscomp[i])prime[p++]=i; for(int j=0;j<p&&prime[j]*i<N;j++) { iscomp[i*prime[j]]=1; if
(i%prime[j]==0)break; } } } void div() { for(int i=0;i<p;i++) { if(prime[i]*prime[i]>n)break; cnt=0; while(n%prime[i]==0) { n/=prime[i]; cnt++; } if(cnt)ans*=cnt*2+1; } if(n>1)ans*=3; } int main() { //freopen("in.txt","r",stdin); scanf("%d",&t); primetable(); int ca=0; while(t--) { ans=1; scanf("%lld",&n); div(); printf("Case %d: %lld\n",++ca,ans/2+1); } return 0; }

總結