济南学习 Day2 T1 am

来源:互联网 发布:电棍在淘宝上叫什么 编辑:程序博客网 时间:2024/04/29 10:15
T1

题意:从1− n中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数

最大可能是多少.

解析:

1、  质因数分解

2、  1->n用质因数指数的相加的形式将1*n累乘起来

3、  扫一遍指数为奇数的质因数都-1,偶数的不变

4、  快速幂乘一遍,同时取模

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define ll long long 5 #define mod 100000007 6 using namespace std; 7 const int N=5e8+10; 8 int prime[N],tot,n; 9 bool check[N];10 void pre()11 {12     for(int i=2;i<=n;i++)13     {14         if(!check[i]) prime[++tot]=i;15         for(int j=1;j<=tot&&prime[j]*i<=n;j++)16         {17             check[prime[j]*i]=1;18             if(i%prime[j]==0) break;19         } 20             21     }22 }23 int main()24 {25     scanf("%d",&n);26     pre();27     memset(check,false,sizeof check );28     for(ll res,i=1;i<=tot;i++)29     {30         res=0;31         for(ll j=prime[i];j<=n;j*=(ll)prime[i]) res+=n/j;32         if(res&1) check[prime[i]]=1; 33     }34     ll ans=1;35     for(int i=2;i<=n;i++) 36       if(!check[i]) ans=ans*i%mod;37     printf("%I64d",ans);38     return 0;39 }

 

0 0
原创粉丝点击