AtCoder Regular Contest 067
C - Factors of Factorial
根据唯一分解定理,$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}$。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<cstdio> 2 #include<iostream> 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 }
D - Walk and Teleport
很显然,跳到中间是不合适的。所以可以从左往右贪心。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<cstdio> 2 #include<iostream> 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 }