【链接】
http://acm.hdu.edu.cn/showproblem.php?pid=4196
【题意】
从[1,n]中选择若干个数,求最大得完全平方数A%mod。
【分析】
A=n!/res (res为n!中质因子得阶数为奇数得乘积)
【代码】
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
using ll = long long;
const int maxn = 10000006;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
ll prime[maxn];
ll fac[maxn];
int vis[maxn];
int cnt = 0;
void getp() {
memset(vis, 0, sizeof(vis));
for (int i = 2; i < maxn; i++) {
if (!vis[i]) {
prime[cnt++] = i;
for (int j = 2 * i; j < maxn; j += i) {
vis[j] = 1;
}
}
}
}
void getf() {
fac[1] = 1;
for (int i = 2; i < maxn; i++) {
fac[i] = fac[i - 1] * i%mod;
}
}
int num(int n, int p) {
int sum = 0;
while (n) {
sum += n / p;
n /= p;
}
return sum;
}
ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1)res = res * a%mod;
a = a * a%mod;
b >>= 1;
}
return res;
}
int main() {
getp();
getf();
int n;
while (~scanf("%d", &n), n) {
ll res = 1;
for (int i = 0; i < cnt&&prime[i] <= n; i++) {
if (num(n,prime[i]) & 1) {
res = res * prime[i] % mod;
}
}
printf("%lld\n", fac[n] * qpow(res, mod - 2) % mod);
}
}