根据唯一分解定理,$N=\prod_{i=1}^{n}p_i^{a_i}$。
那么$N$的因子个数即为$\prod_{i=1}^{n}(a_i+1)$,因数之和为$\prod_{i=1}^{n}\sum_{k=0}^{a_i}p_i^k$。
有一个结论,$N!=\prod_{i=1}^{n}p_i^{a_i}$,则$a_i=\sum_{k=1}^{\infty}\frac{N}{p_i^k}$。
1 #include2 #include 3 using namespace std; 4 typedef long long ll; 5 const int mo = 1e9 + 7; 6 int isnp[1005], p[1005], num, n; 7 8 ll calc(int n, ll d) { 9 ll res = 0;10 for (; n; n /= d) res += n / d;11 return res;12 }13 14 int main() {15 scanf("%d", &n);16 for (int i = 2; i <= n; ++i) {17 if (!isnp[i]) p[++num] = i;18 for (int j = i + i; j <= n; j += i) isnp[j] = 1;19 } ll ans = 1;20 for (int i = 1; i <= num && p[i] <= n; ++i) (ans *= (calc(n, p[i]) + 1)) %= mo;21 printf("%lld\n", ans);22 return 0;23 }
很显然,跳到中间是不合适的。所以可以从左往右贪心。
1 #include2 #include 3 using namespace std; 4 typedef long long ll; 5 int main() { 6 ll n, a, b, p, ans = 0, t; 7 cin >> n >> a >> b >> p; 8 for (int i = 1; i < n; ++i, p = t) { 9 cin >> t; ans += min((t - p) * a, b);10 } cout << ans << endl;11 return 0; 12 }