CodeForces round146

A题,直接水题啦。直接用map统计一下给定的字符串出现的字母的种类。。然后判断奇偶。

#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iostream>
using namespace std;

int main(){
    string name;
    int cnt = 0;
    cin>>name;
    map<char , int>hash;
    for(int i = 0; i !=name.size(); i ++){
        if(hash.find(name[i])!= hash.end()){
            continue;
        }
        else{
            hash[name[i]] = 1;
            cnt ++;
        }
    }
    if(cnt%2){
        puts("IGNORE HIM!");
    }
    else
        puts("CHAT WITH HER!");
    return 0;
}

B题,直接打表。由于最大的数字只有1000000 ,打表的效率nlogn的。然后直接枚举算出来,是1000000,所以复杂度为1000000log1000000

#include <cstdio>
#include <cstring>
typedef long long LL;
const int maxn = 1000000;
const int mod = 1073741824;
int d[maxn+5] ;

int main(){
    for(int i = 1; i <= maxn ; i ++){
        for(int j = i ; j <= maxn ; j +=i){
            d[j] = (d[j] + 1)%mod;
        }
    }
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    int ans = 0;
    for(int i = 1; i <= a ; i ++){
        for(int j= 1; j <= b; j ++){
            for(int k=1 ; k <= c ; k++){
                ans = (ans + d[i*j*k])%mod;
            }
        }
    }
    printf("%d\n" , ans%mod);
}


C题,比赛的时候只推出了一半。。。只证明到n为奇数的时候答案肯定是n*(n-1)*(n-2),然后偶数的时候答案在n*(n-1)*(n-2)/2 ,n*(n-1)*(n-3)/gcd(n, n-3)中(忽略了, (n-1)*(n-2)*(n-3))。

     对于n=1,2,3可以先特判一下。。对于n>3的如下。。
     这里n与n-1的最大公约数必定是1.证明方法可以参考下面的方式。
     先考虑n = 2*k+1,那么2*k+1, 2*k , 2*k-1,两两之间
        的最大公约数只有1,证明如下:
        设d为2*k+1,2*k-1的最大公约数,显然2*k+1与2*k-1可以被d整除
        所以也就是(2*k-1 + 2)/d ,也就得到2可以整除d,d只可能为1或者2
        显然d不可能为2.
        这样n为奇数的时候结果就直接出来了。。
     考虑n = 2*k+2的时候,
        可以分类讨论
        1.在所选的三个数字中必定不含n的,那么也就是
            原问题在n-1条件下的答案,显然为:(n-1)*(n-2)*(n-3).
        对于包含n的,
        先考虑选择了n-1的,对于最后一个数字:
            如果是n-2,那么答案就在n*(n-1)*(n-2)/2中
            如果是n-3, 那么需要考虑n%3==0?是否成立,如果成立答案就可能是
            n*(n-1)*(n-3)/gcd(n,n-3)
            如果是n-4,那么可证n*(n-1)*(n-4)<n*(n-1)*(n-2)
            如果是n-5, 可证n*(n-1)*(n-5)(这里可证公约数必定为1)< (n-1)*(n-2)*(n-3) 直接展开就好。。。
            然后可以直接归纳得到在选择n-1的时候第三个数就在n-2, n-3中

        如果不选择n-1,可以同样证明。这里不再赘述。

#include <cstdio>
#include <cstring>
typedef long long LL;

LL gcd(LL a, LL b){
    return b==0? a : gcd(b,a%b);
}

LL max(LL a, LL b){
    return a > b ? a : b;
}

int main(){
    LL n;
    LL ans = 0;
    scanf("%I64d", &n);
    if(n==1)
        printf("1\n");
    else if(n==2)
        printf("2\n");
    else if(n==3)
        printf("6\n");
    else{
        if(n%2==1)
            printf("%I64d\n",n*(n-1)*(n-2));
        else{
            LL tmp;
            ans = n*(n-1)*(n-2)/gcd(n*(n-1), n-2);
            tmp = (n-1)*(n-2)*(n-3);
            ans = max(ans, tmp);
            tmp = n*(n-1)*(n-3)/gcd(n*(n-1), n-3);
            ans = max(ans, tmp);
            printf("%I64d\n", ans);
        }
    }
    return 0;
}

D题,比赛的时候完全没想法,看完解题报告还是没有太明白。。
E题,表示不会。。看了解题报告后原来用后缀自动机。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值