总的来说这两场比赛挺简单的。
贪心枚举每个终止位置即可, 考试的时候有些细节没处理好, 差点迎来人生第一次cf的ak了,有点可惜。
#include
using namespace std;
const int N = 1e6 + 5;
int a[N], b[N];
#define int long long
void solve(){
int n, c;
cin >> n >> c;
for(int i = 0;i < n; i++) cin >> a[i];
for(int i = 0;i < n - 1; i++) cin >> b[i];
int now = 0, step = 0, pos = 0, ans = 1e9;
/*
if(lcm(a[pos], a[pos + 1]) + now >= c) {
(c - now) / a[pos];
}
*/
b[n - 1] = c;
while(1){
int t = ceil(1.0 * (c - now) / a[pos]), st = ceil(1.0 * (b[pos] - now) / a[pos]);
ans = min(ans, step + t);
step += st;
now += st * a[pos];
if(pos >= n - 1) break;
now -= b[pos];
pos++;
step++;
}
cout << ans << endl;
}
signed main(){
int Case;
cin >> Case;
while(Case--) solve();
return 0;
}
这题是给定一个数 c c c,问他是否是某一个数的约数之和。对一个数 n = p 1 α 1 p 2 α 2 p 3 α 3 . . . n = p_1^{\alpha1} p_2^{\alpha2} p_3^{\alpha3}... n=p1α1p2α2p3α3...,一定有约数之和 S = ( 1 + p 1 + p 1 2 + . . . + p 1 α 1 ) ( 1 + p 2 + p 2 2 + . . . + p 2 α 2 ) . . . . . . S = (1 + p_1+ p_1 ^2 + ... + p_1^{\alpha1})(1 + p_2+ p_2 ^2 + ... + p_2^{\alpha2})...... S=(1+p1+p12+...+p1α1)(1+p2+p22+...+p2α2)......, 很容易得出 d ( n ) = d ( n p 1 α 1 ) ∗ p 1 α 1 d(n) = d(\displaystyle\frac{n}{p_1 ^ {\alpha1}})*p_1^{\alpha1} d(n)=d(p1α1n)∗p1α1, 然后用这个方程dp就好了, 其中 p 1 p_1 p1可以用埃氏筛求, 足够在规定时间求出结果了。(PS:这题用unordered_map会超时,用时大概是数组的5倍左右)
#include
using namespace std;
const int N = 1e7 + 1;
int d[N], s[N], ans[N];
int tt;
int main(){
memset(d, -1, sizeof d);
for(int i = 2;i * i < N; i++){
if(d[i] == -1){
d[i] = i;
for(int j = i * i; j < N; j += i){
d[j] = i;
}
}
}
s[1] = 1;
for(int i = 2;i < N; i++){
if(d[i] == -1)
d[i] = i;
int j = i;
s[i] = 1;
bool flag = 0;
while(j % d[i] == 0){
j /= d[i];
s[i] = s[i] * d[i] + 1;
if(s[i] >= N){
flag = 1;
break;
}
}
if(flag) continue;
s[i] *= s[j];
if(s[i] >= N) continue;
/* if(s[i] >= N){
//cout << i <
// if(s[i] == 11) cout << i <
if(!ans[s[i]])
ans[s[i]] = i;
}
// for(int i = tt + 1;i < N; i++) if(d[i] == -1) if(!ans.count(i + 1)) ans[i + 1] = i;
// printf("Time = %d\n", clock());
ans[1] = 1;
int Case;
scanf("%d", &Case);
while(Case--){
int t;
scanf("%d", &t);
if(ans[t]) printf("%d\n", ans[t]);
else puts("-1");
}
return 0;
}
官方题解用的 p o l y a polya polya定理,还没学会, 待补。