统计分母在区间[a,b]的最简真分数共有多少个?并求这些最简真分数升序序列中的第k项。
所谓最简真分数是指:分子小于分母,且分子分母无公因数的分数。
这个循环就可以了
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4 + 5;
int phi[MAXN];
int prime[MAXN];
int cnt_prime = 0;
void get_phi(int n) {
phi[1] = 1;
for(int i = 2; i <= n; i++) {
if(phi[i] == 0) {
phi[i] = i - 1;
prime[cnt_prime++] = i;
}
for(int j = 0; j < cnt_prime && prime[j] * i <= n; j++) {
if(i % prime[j] == 0) {
phi[i*prime[j]] = phi[i] * prime[j];
break;
}
else phi[i*prime[j]] = phi[i] * phi[prime[j]];
}
}
}
int main() {
int a, b, k;
cin >> a >> b >> k;
get_phi(b);
int idx = 0;
vector<pair<int,int>> vec;
for(int i = a+1; i <= b; i++) {
if(i == 1) continue; // 分母不能为1
int fz = phi[i];
int fm = i;
int g = __gcd(fz, fm);
fz /= g;
fm /= g;
vec.push_back(make_pair(fz, fm));
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
if(k > vec.size()) cout << "NO\n";
else cout << vec[k-1].first << '/' << vec[k-1].second << endl;
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:1,先开第一个房,让a住进去.
2,因为b没有办法塞到第一个房间里,所以需要再开第二间房.
3,由于b刚好住满第二间房,所以c只能再开一间房单独住.
**所以最终需要开3间房,一共是12平米.有人会问,为什么a,c不去挤一间房呢.这么跟你解释,他们分配的顺序不连续,想挤在一起都没有机会.
typedef struct Node
{
char a;
int b;
char c;
}Node;
printf("%d", sizeof(Node)); //12