橙(ran )

【题目背景】

“蓝!慧音又给我布置数学题啦”手握试卷的橙急急忙忙地冲进屋内。

“是吗?你有没有好好做啊?”蓝回过头来,九条尾巴甩动了一下,将灶台

边的碗全扫了下去,顿时全被摔得四分五裂。

“啊!呜呜呜。。。怎么办啊,紫又要骂我了。”

由于蓝正焦灼于怎样跟紫解释,而橙又是一只智商只有小孩水平的妖怪猫,

这种数学题她当然不会做了,所以她决定像你求助。

【问题描述】

具体的,慧音给了橙一个区间 [1,n] , 1 ,慧音想让橙求出能够整除这段区间每一

个数的最小的数。

【输入格式】

输入一行一个正整数 n 。

【输出格式】

一行一个正整数,表示能整除这段区间的最小的数,答案对 100000007 取模。

【样例 1 1 输入】

7

【样例 1 1 输出】

420

【样例 1 1 说明】

420 是可以整除区间 1--7 , 1 每个数的最小的数。

【子任务】

7


题解:求1--n的最小公倍数

最小公倍数就是所有质数的相应幂的积
比如N=10
小于10的质数有2,3,5,7(如果N为7,则也为2 3 5 7)
对应的最大幂是:3,2,1,1
则最小公倍数是:2^3x3^2x5^1x7^ =2520

代码:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;

int n,cnt,check[2500005],prime[1565928];
LL ans;

void euler(int x){
    for(int i=2;i<=x;i++){
        if(!check[i]){
            prime[++cnt]=i;
            LL tmp=i;
            while(tmp*i<=x)tmp*=i;
            ans*=tmp;ans%=100000007;
        }
        for(int j=1;j<=cnt&&prime[j]*i<=x;j++){
            check[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}

int main(){
    freopen("chen.in","r",stdin);
    freopen("chen.out","w",stdout);
    while(scanf("%d",&n)!=EOF){
        ans=1;cnt=0;
        memset(check,0,sizeof(check));
        memset(prime,0,sizeof(prime));
        euler(n);
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2017-09-25 19:42  ANhour  阅读(178)  评论(0编辑  收藏  举报