最小公倍数取模

2019-04-14 08:39发布

题目:求一个最小的整数,能被1~n中的所有数整除。n的范围为 1 <= n <= 100000,答案对1e9+7取模。   思路:一上来有些人可能认为可以先求最小公倍数然后再取模,这样显然是不可以的,因为求最小公倍数中有除法,除法是不能直接取模的,就算用了逆元,也是不对的。 我们可以把每一个数进行质因数分解,之后求最小公倍数,最后用快速幂求出答案并取模就正确了。 举个例子: a = 16, b = 20,求a,b的最小公倍数 a有4个质因数2 b有2个质因数2,和1个质因数5 所以a,b的最小公倍数等于    2^max(4,2) * 5^max(0,1) = 80    #include #include #include #include #include #define LL long long using namespace std; const int maxn = 1e5 + 10; const int mod = 1e9 + 7; int f[maxn],p[maxn],cnt = 0; int b[maxn]; void prime() { LL i,j; f[1] = 1; for(i=2;i b[p[i]]) b[p[i]] = t; i++; } if(x > 1) b[x] = max(b[x],1); } LL qpow(LL x,int k) { LL ans = 1; while(k) { if(k&1) ans = ans*x%mod; x = x*x%mod; k /= 2; } return ans; } LL gcd(LL a,LL b) { if(b == 0) return a; else return gcd(b,a%b); } LL com(LL a,LL b) { return a/gcd(a,b)*b; } int main(void) { int n,i,j; prime(); scanf("%d",&n); memset(b,0,sizeof(f)); for(i=1;i<=n;i++) { fun(i); } LL ans = 1; for(i=2;i<=n;i++) { ans = ans*qpow(i,b[i])%mod; } cout << ans << endl; return 0; }