标签:++ ons str iostream gif art freopen image close
【问题描述】
从中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少。
【输入格式】
第一行一个数字。
【输出格式】
一行一个整数代表答案对取模之后的答案。
【样例输入】
7
【样例输出】
144
【样例解释】
但是塔外面有东西。
【数据规模与约定】
对于20%的数据,1<=N<=100。
对于50%的数据,1<=N<=5000。
对于70%的数据,1<=N<=10^5。
对于100%的数据,1<=N<=5*10^6。
题解:可以将n的阶乘质因数分解,然后若质因数的指数为奇数则指数减1乘进答案。若为偶数直接乘进答案。因为只有当质因数的指数是偶数时,才能开方开出来,当质因数指数是奇数时,可以除以一个这个质因数,就可以开出来了。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define N 5000100 using namespace std; const int M=100000007; int n,num(0); long long ans(1); int ss[N],zs[N]={0}; bool f[N]={0}; int oula()//欧拉筛法 { for (int i=2;i<=n;i++) { if (!f[i]) ss[++num]=i; for (int j=1;j<=num,ss[j]*i<=n;j++) { f[ss[j]*i]=1; if (!(i%ss[j])) break; } } } long long jc(long long p,long long k)//快速幂 { long long ki=1; while (k) { if (k%2) ki=ki*p%M; p=p*p%M; k/=2; } return ki; } int main() { freopen("hao.in","r",stdin); freopen("hao.out","w",stdout); scanf("%d",&n); oula(); for (int i=1;i<=num;i++)//n的阶乘质因数分解 { int k=n; while (k) { zs[i]+=k/ss[i]; k/=ss[i]; } } for (int i=1;i<=num;i++) { if (zs[i]%2) ans=ans*jc(ss[i],zs[i]-1)%M; else ans=ans*jc(ss[i],zs[i])%M; } cout<<ans<<endl; fclose(stdin); fclose(stdout); return 0; }
标签:++ ons str iostream gif art freopen image close
原文地址:http://www.cnblogs.com/sjymj/p/6037426.html