橙(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; }