完全平方数(钟神的hao)
【问题描述】
从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数
最大可能是多少。
【输入格式】
第一行一个数字?。
【输出格式】
一行一个整数代表答案对100000007取模之后的答案。
【样例输入】
7
【样例输出】
144
【样例解释】
但是塔外面有东西。
【数据规模与约定】
210。
55000。
70%的数据,1 ≤ ? ≤ 10 5 。
对于100%的数据,1 ≤ ? ≤ 5× 10 6 。
思路:
打素数表+分解质因数=满分ac-->ak虐场-->noip一等-->noi金牌-->IOI金牌-->acm领奖台(别做梦了写代码吧)
来,上代码:
#include<cstdio> #define LL long long #define INF 100000007LL using namespace std; LL n,Num(0),Ans=1,Sum[350000]={0},Prime[350000]; bool Flag[5000001]={0}; LL Count(LL S,LL X) { LL Number=1; while (S) { if (S&1) Number=(Number*X)%INF; X=(X*X)%INF; S>>=1; } return Number; } void Euler() { for (LL a=2;a<=n;a++) { if (!Flag[a]) Prime[Num++]=a; for (LL b=0;b<Num&&a*Prime[b]<=n;b++) { Flag[a*Prime[b]]=true; if (!(a%Prime[b])) break; } } } int main() { scanf("%I64d",&n); Euler(); for (LL a=0;a<Num;a++) { LL t=n; while (t) { Sum[a]+=t/Prime[a]; t/=Prime[a]; } } for (LL a=0;a<Num;a++) if (Sum[a]&1) Ans=(Ans*Count(Sum[a]-1,Prime[a]))%INF; else Ans=(Ans*Count(Sum[a],Prime[a]))%INF; printf("%I64d",Ans); return 0; }