#include<bits/stdc++.h> usingnamespace std; using ll = longlong; constint maxn = 2e5 + 10; const ll mod = 1e9 + 7; ll inv[maxn], fac[maxn]; // 分别表示逆元和阶乘 // 快速幂 ll quickPow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; }
voidinit() { // 求阶乘 fac[0] = 1; for (int i = 1; i <= maxn; i++) { fac[i] = fac[i - 1] * i % mod; } // 求逆元 inv[maxn - 1] = quickPow(fac[maxn - 1], mod - 2); for (int i = maxn - 2; i >= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % mod; } } ll C(int n, int m) { if (m > n) { return0; } if (m == 0) return1; return fac[n] * inv[m] % mod * inv[n - m] % mod; } ll get(ll a, ll b, ll c, ll d) { returnC(c - a + d - b, c - a) % mod; } intmain() { int n, k; cin >> n >> k; ll sum = 0; ll a, b; cin >> a >> b; for (int i = 1; i <= n - k; i++) { sum += b; } for (int i = 1; i <= min(n,k); i++) { sum += a; } cout << sum << '\n';
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; constint maxn = 2e5 + 10; const ll mod = 1e9 + 7; ll inv[maxn], fac[maxn]; // 分别表示逆元和阶乘 // 快速幂 ll quickPow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; }
voidinit() { // 求阶乘 fac[0] = 1; for (int i = 1; i <= maxn; i++) { fac[i] = fac[i - 1] * i % mod; } // 求逆元 inv[maxn - 1] = quickPow(fac[maxn - 1], mod - 2); for (int i = maxn - 2; i >= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % mod; } } ll C(int n, int m) { if (m > n) { return0; } if (m == 0) return1; return fac[n] * inv[m] % mod * inv[n - m] % mod; } ll get(ll a, ll b, ll c, ll d) { returnC(c - a + d - b, c - a) % mod; } intmain() { map<char, int> mp; string s; cin >> s; for (auto c : s) { mp[c]++; } for (auto &[a, b] : mp) { if (b & 1) { cout << "No" << '\n'; return0; } } cout << "Yes" << '\n'; return0; }
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; constint maxn = 2e5 + 10; const ll mod = 1e9 + 7; ll inv[maxn], fac[maxn]; // 分别表示逆元和阶乘 // 快速幂 ll quickPow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; }
voidinit() { // 求阶乘 fac[0] = 1; for (int i = 1; i <= maxn; i++) { fac[i] = fac[i - 1] * i % mod; } // 求逆元 inv[maxn - 1] = quickPow(fac[maxn - 1], mod - 2); for (int i = maxn - 2; i >= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % mod; } } ll C(int n, int m) { if (m > n) { return0; } if (m == 0) return1; return fac[n] * inv[m] % mod * inv[n - m] % mod; } ll get(ll a, ll b, ll c, ll d) { returnC(c - a + d - b, c - a) % mod; } intmain() { int n; cin >> n; int t; cin >> t; vector<int> a(n + 1); vector<vector<ll>> dp(3000, vector<ll>(n + 1)); for (int i = 1; i <= n; i++) { cin >> a[i]; } dp[0][0] = 1; int sum = 0; for (int i = 1; i <= n; i++) { sum += a[i]; for (int j = sum; j >= a[i]; j--) { for (int k = 1; k <= i; k++) { dp[j][k] += dp[j - a[i]][k - 1]; } } } ll ans = 0; for (int i = 1; i <= n; i++) { ans += dp[i * t][i]; } cout << ans << '\n'; return0; }
D
题目大意: 给你整数 n 和 s,判断是否存在一个整数 b,使得 n 在 b
进制下的数位和等于 s。
// LUOGU_RID: 173153088 #include<bits/stdc++.h> usingnamespace std; using ll = longlong; constint maxn = 2e5 + 10; const ll mod = 1e9 + 7; ll inv[maxn], fac[maxn]; // 分别表示逆元和阶乘 // 快速幂 ll quickPow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; }
voidinit() { // 求阶乘 fac[0] = 1; for (int i = 1; i <= maxn; i++) { fac[i] = fac[i - 1] * i % mod; } // 求逆元 inv[maxn - 1] = quickPow(fac[maxn - 1], mod - 2); for (int i = maxn - 2; i >= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % mod; } } ll C(int n, int m) { if (m > n) { return0; } if (m == 0) return1; return fac[n] * inv[m] % mod * inv[n - m] % mod; } ll get(ll a, ll b, ll c, ll d) { returnC(c - a + d - b, c - a) % mod; } ll n, s; boolcheck(ll x) { ll nn = n; ll ss = s; ll res = 0; while (nn) { res += nn % x; nn /= x; } return res == ss; } intmain() { cin >> n >> s; if (n == s) { cout << n + 1 << '\n'; return0; } if (n < s) { cout << -1 << '\n'; return0; } ll ans = -1; for (int i = 2; i <= n / i; i++) { if (check(i)) { ans = i; cout << ans << '\n'; return0; } } ll k = n - s; ans = 1e18; for (int i = 1; i <= k / i; i++) { if (k % i) { continue; } ll c = k / i + 1; ll d = s - i; if (c >= n / c && d >= 0 && i < c && d < c && c >= 2) { ans = min(c, ans); } } if (ans == 1e18) { cout << -1 << '\n'; } else { cout << ans << '\n'; } return0; }