18.4.09 模拟考 zhx P75
Posted whymhe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18.4.09 模拟考 zhx P75相关的知识,希望对你有一定的参考价值。
题目链接 https://files.cnblogs.com/files/lovewhy/P75.pdf
P75
竞赛时间: ????年??月??日??:??-??:??
注意事项(请务必仔细阅读)
T1
【 问题描述】
从1 − N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数
最大可能是多少。
【输入格式】
第一行一个数字N。
【输出格式】
一行一个整数代表答案对100000007取模之后的答案。
【样例输入】
7
【样例输出】
144
【样例解释】
但是塔外面有东西。
【数据规模与约定】
对于20%的数据, 1 ≤ N ≤ 100。
对于50%的数据, 1 ≤ N ≤ 5000。
对于70%的数据, 1 ≤ N ≤ 10^5。
对于100%的数据, 1 ≤ N ≤ 5 × 10^6。
//数学题2333 //竟然考了数学题mmp //果然翻车了 //T1一分也没有 //数论是个大坑,埋葬了我 //把n!分解质因数,记录质因子出现的个数 //如果某个质因子a出现了偶数次,假设是b次,那么它就可以由a^(b/2) * a^(b/2)得到, //也就是说,只要这个质因子出现了偶数次,它就组成了一个完全平方数 //如果多个质因子出现了偶数次,同理,他们也可以都分成两半再乘起来得到 //如果是奇数呢? //那就丢一个,使其变成偶数次 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int mod=1e8+7; const int N=5e6+5; int n; int tot[N]; int prime[N],cnt; bool nprime[N]; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-\'0\'; return num; } inline void init() { long long tmp; for(int i=2;i<=n;++i) { if(!nprime[i]) prime[++cnt]=i; for(int j=1;j<=cnt;++j) { tmp=1ll*prime[j]*i; if(tmp>n) break; nprime[tmp]=1; if(i%prime[j]==0) break; } } } long long ksm(long long a,long long k) { long long Ans=1; while(k) { if(k&1) Ans=Ans*a,Ans%=mod; k>>=1; a*=a; a%=mod; } return Ans; } inline void work() { for(int i=1;i<=cnt;++i) { int tmp=n; while(tmp) { tot[i]+=tmp/prime[i]; tmp/=prime[i]; } } } int main() { n=read(); init(); work(); long long ans=1; for(int i=1;i<=cnt;++i) { ans*=1ll*ksm(prime[i],tot[i]/2*2); ans%=mod; } printf("%lld",ans); return 0; }
T2
【问题描述】
有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[ 以上是关于18.4.09 模拟考 zhx P75的主要内容,如果未能解决你的问题,请参考以下文章