求助站外题(不知道该怎么写了)悬关*2
  • 板块学术版
  • 楼主2011Andy
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/4 15:37
  • 上次更新2023/11/3 05:56:57
查看原帖
求助站外题(不知道该怎么写了)悬关*2
660871
2011Andy楼主2023/8/4 15:37

在古老的大陆上有 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;
}
2023/8/4 15:37
加载中...