题目大意
题目名称:C. You can’t just take and divide(你不能只是拿来分析)
题目描述:
Anatoly 和 Antitoly 对资源的分配有不同的看法。Antitoly 正在开发一个由参数 n 定义的理想社会模型。你需要帮他计算在区间 [1,n] 中,有多少个整数 x 同时满足以下两个条件:
-
x 是奇数。
-
x 的因子个数是奇素数。
输入格式:
第一行包含一个奇整数 n (3≤n≤11113)。注意数据范围非常大,需使用能够处理大数的类型或高精度。
输出格式:
输出一个整数 R,表示满足条件的 x 的个数。
样例 1
样例 1 解释:
样例 2
样例 2 解释:
样例 3
样例 3 解释:
样例 4
样例 5
1 2 3 4 5
| 输入: 9753113579
输出: 9563
|
思路讲解
ABC-383-D - 9 Divisors
使用因数个数定理,或者说是约数个数定理。

其实使用约束个数定理不难得出如下的结论,那么 P 的 e1 次方就是我们所要枚举得出的这个数。
pe1; e1+1,p∈{3,5,7,11,⋯}(除了2的所有素因数)
由于 e1 是从这个 2 开始的,所以我们直接遍历的时间复杂度是 O(n)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| void Solve() { ll N; cin >> N; sieve(1e7); ll ans=0; for (auto e1:primes) { if (e1==2) continue; for (auto p:primes) { if (p==2) continue; __int128 num=1; for (int i=1;i<=e1-1;++i) { num*=p; } if (num>N) { if (p==3) { cout<<ans<<"\n"; return; } break; }else { ++ans; } } } }
|
AC代码
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#include <bits/stdc++.h> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<" = ["<<var<<"]"<<"\n"; #define debug1d(a) \ cerr << #a << " = ["; \ for (int i = 0; i < (int)(a).size(); i++) \ cerr << (i ? ", " : "") << a[i]; \ cerr << "]\n"; #define debug2d(a) \ cerr << #a << " = [\n"; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " ["; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ cerr << (j ? ", " : "") << a[i][j]; \ cerr << "]\n"; \ } \ cerr << "]\n"; #define debug3d(a) \ cerr << #a << " = [\n"; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [\n"; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ { \ cerr << " ["; \ for (int k = 0; k < (int)(a[i][j]).size(); k++) \ cerr << (k ? ", " : "") << a[i][j][k]; \ cerr << "]\n"; \ } \ cerr << " ]\n"; \ } \ cerr << "]\n"; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x)
using namespace std;
using ll = long long; using ull = unsigned long long; using DB = double;
using CD = complex<double>;
static constexpr ll MAXN = (ll)1e6+10, INF = (1ll<<61)-1; static constexpr ll mod = 998244353; static constexpr double eps = 1e-8; const double pi = acos(-1.0);
ll lT,testcase;
vector<ll> minp,primes; void sieve(ll n){ minp.assign(n+5,0); for(int i=2;i<=n;++i){ if(minp[i]==0){ minp[i]=i; primes.push_back(i); } for(auto p:primes){ if(i*p>n){ break; } minp[i*p]=p; if(p==minp[i]){ break; } } } }
void Solve() { ll N; cin >> N; sieve(1e7); ll ans=0; for (auto e1:primes) { if (e1==2) continue; for (auto p:primes) { if (p==2) continue; __int128 num=1; for (int i=1;i<=e1-1;++i) { num*=p; } if (num>N) { if (p==3) { cout<<ans<<"\n"; return; } break; }else { ++ans; } } }
}
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #ifdef LOCAL cout.setf(ios::unitbuf); #endif
Solve(); return 0; }
|
心路历程(WA,TLE,MLE……)