在古老的大陆上有 n 个国家,作为异世界的你想要征服这片大陆
你排出无穷个士兵,每个士兵的路线不同。
第一位士兵的路线是:1->2->4->8->16->....
第二位士兵的路线是:1->3->9->27->81->....
第三位士兵的路线是:1->5->25->125....
第四位士兵的路线是:1->7->49........
。。。。。。
用数学的语言来解释,第 i 士兵的路线是首项为 1,公比为 q(i) 的等比数列,其中 q(i) 代表第 i 个素数。
当士兵每经过一座城市,你的士兵就会把这个城市攻占。
你想知道,所有没有被攻占的城市编号的 lcm(最小公倍数 ,Least common multiple)是多少?
由于这个 lcm 可能非常大,请输出它对 1 0 9 + 7 10 9 +7 取模的值。
输入描述: 一个正整数 n ( 1 ≤ 1.8 × 1 0 8 ) (1≤n≤1.8×10 8 )
输出描述: 如果所有数都被攻占了,请输出一个字符串"empty"
否则输出所有没有被攻占的城市编号的lcm,对 1 0 9 + 7 10 9 +7 取模
输入输出样例 输入数据 1 7 输出数据 1 6 说明 第一位士兵攻占: 1 , 2 , 4 1,2,4
第二位士兵攻占: 1 , 3 1,3
第三位士兵攻占: 1 , 5 1,5
第四位士兵攻占: 1 , 7 1,7
所以剩下的城市只有一个 6 ,所有数的 lcm 为 6
#include <bits/stdc++.h>
using namespace std;
const int N = 1e8 + 5;
const int mod = 1e9 + 7;
int n;
int gcd(int a , int b){
return b == 0 ? a : gcd(b , a % b);
}
int gcb(int a , int b){
return b == 0 ? a : a * b / gcd(b , a % b);
}
bool flag[N];
int su[N];
int cnt;
void sieve(int x){
memset(flag , 1 , sizeof(flag));
flag[1] = 0;
for(int i = 2 ; i <= n ; i++){
if(flag[i]) su[++cnt] = i;
for(int j = 1 ; j <= cnt && i * su[j] <= n ; j++) {
flag[i * su[j]] = 0;
if(i % su[j] == 0) break;
}
}
}
int cmt;
int mark[N];
void init(int x){
mark[1] = 1;
for(int i = 1 ; ; i++){
if(su[i] > x) break;
while(true){
if(pow(2 , cmt + 1) > x) break;
int kbxx = pow(2 , cnt);
mark[kbxx] = 1;
++cnt;
}
}
}
int ans;
int main(){
cin >> n;
sieve(n);
init(n);
for(int i = 1 ; i <= n ; i++){
if(mark[i] != 1) ans = lcm(ans , );
}
if(!ans) cout << "empty";
else cout << ans;
return 0;
}