[COGS 2524]__完全平方數
阿新 • • 發佈:2017-09-08
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 #definesqr(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]__完全平方數