for i inrange(2, n + 1): if is_prime[i]: primes.append(i) # i是素数 for j inrange(len(primes)): # 将已知素数primes[j]与当前数i相乘,标记其倍数为非素数 if primes[j] * i > n: break is_prime[primes[j] * i] = False if i % primes[j] == 0: # 如果i是primes[j]的倍数,跳出循环 break
return primes
n = 30# 你可以设置需要查找素数的上限 primes = linear_sieve(n) print("小于等于", n, "的素数:", primes)
intmain() { // 请在此输入您的代码 longlong n; cin>>n; longlong res = 0; for (int i = 2; i <= n / i; i++) { int num = 0; while (n % i == 0) { n /= i; num++; } if (num > 0)res++; } if (n > 1)res++; cout<<res; return0; }
每次水壶只会增加或者减少x 或y的水 只要x + y >= z 找出一对a, b使得ax+by=z就可以 那么就需要找出xy的最大公约数
贝祖定理告诉我们,ax+by=z ax+by=z $ax+by=z$ 有解当且仅当 z 是 x y 的最大公约数的倍数
1 2 3 4 5 6 7 8 9 10
classSolution { public: boolcanMeasureWater(int x, int y, int z) { if (x + y < z)returnfalse; if (x == 0 || y == 0)return z == 0 || x + y == z; return z % gcd(x, y) == 0;
} };
gcd
1 2 3 4
longlonggcd(longlong a, longlong b) { return b == 0: a? gcd(b, a) }
int nums[10010]; int vis[10010]; intmain() { int n = 0; cin>>n; for (int i = 1; i <= n; i++) { cin>>nums[i]; } int cnt = 0; for (int i = 1; i <= n; i++) { if (!vis[nums[i]]) { cnt++; int j = i; while (!vis[nums[j]]) { vis[nums[j]] = 1; j = nums[j]; } } } cout<<n - cnt; }