codeforces div3 715、abc198补题

总的来说这两场比赛挺简单的。

F. Education

贪心枚举每个终止位置即可, 考试的时候有些细节没处理好, 差点迎来人生第一次cf的ak了😭,有点可惜。

#include<bits/stdc++.h>
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;
}

G. Short Task

这题是给定一个数 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<bits/stdc++.h>
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 <<endl;
        tt = i;
         break;}*/
       // if(s[i] == 11) cout << i <<endl;
       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;
}

abc198 F

官方题解用的 p o l y a polya polya定理,还没学会, 待补。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值