1. 程式人生 > >求1~n的lcm

求1~n的lcm

題意很簡單,但資料量巨大,出題人給了4s.利用唯一分解定理和1-n數字因子的特點去解決。

詳見程式碼,很容易理解。、

#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<iomanip>
#include<string.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 100000007
using namespace std;
bool isprime[100000005];
int ans[10000005];
int prime[10000005],top;
void check()
{
    for(int i=2; i<100000005; i++)
    {
        if(isprime[i]==0)
            prime[top++]=i;
        for(int j=0; j<top&&prime[j]*i<100000005; j++)
        {
            isprime[i*prime[j]]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
ll n;
int main()
{
    check();
    while(~scanf("%lld",&n))
    {
        ll sum=1;
        for(int i=0; i<top; i++)
        {
            ll tt=n;
            if(prime[i]>n)
                break;
            while(tt>=prime[i])
            {
                tt/=prime[i];
                sum*=prime[i];
                sum%=mod;
            }

        }
        printf("%lld\n",sum);
    }
    return 0;
}