9.16 第四题 数论 欧拉筛+唯一分解定理

来源:互联网 发布:网络盒子加密软件 编辑:程序博客网 时间:2024/06/05 17:47

题目大意:
输入n;
从1到n找一些数乘起来,使得答案是一个完全平方数,并尽量使这个数大,答案模100000007;

样例:
输入
7
输出
144

Q

思路:
1.将所有合数分解为素数;
2.统计所有分解后 每个素数的个数;
3.个数为奇数 ,个数减一跑快速幂,偶数直接跑;

统计素数个数
n=8;1~8中
2的个数:
2:1个
4:2个
6:1个
8:3个

2的个数=8/2+8/4+8/8=7;
及n/2^1+n/2^2+……+n/2^k=num;

机智……

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const ll MAXN=6000001,mod=100000007;ll is_prime[MAXN],cnt,n,num[MAXN];bool not_prime[MAXN];void euler(){    not_prime[1]=true;    for(ll i=2;i<=n;i++)    {        if(!not_prime[i]) is_prime[++cnt]=i;        for(ll j=1;j<=cnt && is_prime[j]*i<=0;j++)        {            not_prime[is_prime[j]*i]=true;            if(i % is_prime[j]==0) break;        }     }    return;}ll ksm(ll a,ll b){    ll ans=1;    while(b)    {        if(b & 1) ans=(ans*a)%mod;        a=(a*a)%mod;        b>>=1;    }    return ans%mod;}void solve(){    cin>>n;    euler();    for(ll i=1;i<=cnt;i++)    {        ll s=n;        while(s)        {            num[i]+=s/is_prime[i];            s/=is_prime[i];        }    }    ll an=1;    for(ll i=1;i<=cnt;i++)    {        if(num[i]%2)            an=(an*ksm(is_prime[i],num[i]-1)%mod)%mod;        else             an=(an*ksm(is_prime[i],num[i])%mod)%mod;    }    cout<<an;}int main(){    solve();    return 0;}
原创粉丝点击