1. 程式人生 > >[COGS 2524]__完全平方數

[COGS 2524]__完全平方數

ace std printf 表示 return false sam blog sta

Description

一個數如果是另一個整數的完全平方,那麽我們就稱這個數為完全平方數(Pefect Sqaure),也稱平方數。小A認為所有的平方數都是很perfect的~

於是他給了小B一個任務:用任意個不大於n的不同的正整數相乘得到完全平方數,並且小A希望這個平方數越大越好。請你幫助小B告訴小A滿足題意的最大的完全平方數。

Input

輸入僅 1行,一個數n。

Output

輸出僅 1 行,一個數表示答案。由於答案可以很大,

所以請輸出答案對 100000007 取模後的結果。

Sample Input1

7

Sample Output1

144

Sample Input2

9

Sample Output2

5184

題解

完全平方數,要保證所有質因數的次數都是偶數,

貪心的思想,因數越多越好,我們不妨將$1~n$全選,再全部質因數分解。

若枚舉到的質因數次數為奇,$-1$即可。

 1 #include <set>
 2 #include <map>
 3 #include <ctime>
 4 #include <cmath>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8
#include <cstdio> 9 #include <string> 10 #include <cstring> 11 #include <cstdlib> 12 #include <iostream> 13 #include <algorithm> 14 #define LL long long 15 #define Max(a, b) ((a) > (b) ? (a) : (b)) 16 #define Min(a, b) ((a) < (b) ? (a) : (b)) 17 #define
sqr(x) ((x)*(x)) 18 using namespace std; 19 const int N = 5000000; 20 const LL MOD = 100000007; 21 22 int n; 23 bool isprime[N+5]; 24 int q[N+5], tot; 25 int pre[N+5], cnt[N+5]; 26 27 void prepare() { 28 memset(isprime, 1, sizeof(isprime)); 29 isprime[1] = false; 30 for (int i = 2; i <= n; i++) { 31 if (isprime[i]) q[++tot] = i; 32 for (int j = 1; j <= tot && i*q[j] <= n; j++) { 33 isprime[i*q[j]] = false; 34 pre[i*q[j]] = q[j]; 35 if (!(i%q[j])) break; 36 } 37 } 38 } 39 40 LL pow(LL a,LL b) { 41 LL c = 1; 42 while (b) { 43 if (b&1) c = (c*a)%MOD; 44 b >>= 1; 45 a = (a*a)%MOD; 46 } 47 return c; 48 } 49 50 int main() { 51 scanf("%d", &n); 52 prepare(); 53 for (int i = 2; i <= n; i++) { 54 int j = i; 55 while (pre[j]) { 56 cnt[pre[j]]++; 57 j /= pre[j]; 58 } 59 cnt[j]++; 60 } 61 LL ans = 1; 62 for (int i = 2; i <= n; i++) ans = (ans*pow((LL)i, (LL)cnt[i]/2*2))%MOD; 63 printf("%lld\n", ans); 64 return 0; 65 }

[COGS 2524]__完全平方數