2019 百度之星初赛 [01-04]

70 篇文章 0 订阅

题目链接http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=862

 

1001:

对小的暴力枚举

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef complex<double> comp;
const double pi = acos(-1);
const int mx = 1e5 + 10;
const int N = 1<<11;
int main()
{     
    int t;
    scanf("%d",&t);
    while(t--){
        int V;
        vector <int> g;
        scanf("%d",&V);
        int sum = 0 ,tmp = V;
        while(tmp){
            int d = tmp%10;
            sum += d;
            tmp /= 10;
        }
        int count = 0;
        for(int i=1;i<=sum;i++){
            if(sum%i==0&&V%i==0){
                count++;
                g.push_back(i);
            }
        }
        printf("%d\n",count);
        for(int i=0;i<g.size();i++)
        printf("%d%c",g[i],i==g.size()-1?'\n':' ');
    }
    return 0;
}

1002:

还是暴力

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef complex<double> comp;
const double pi = acos(-1);
const int mx = 1e5 + 10;
const int N = 1<<11;
char s[100],c[100];
int main()
{     
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        int cnt[55][55];
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<=n;i++){
            scanf("%s%s",s,c);
            vector <int> g[30];
            for(int i=0;c[i];i++){
                g[c[i]-'a'].push_back(i+1);
            }
            for(int i=0;s[i];i++){
                for(int v:g[s[i]-'a'])
                    cnt[i+1][v]++;
            }
        }
        bool vis[55];
        memset(vis,0,sizeof(vis));
        vector <int> ans;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=m;j++){
                if(cnt[i][j]==n&&!vis[j]){
                    ans.push_back(j);
                    vis[j] = 1; 
                    break;
                }
            }
        }
        if (ans.size()!=m) printf("-1\n");
        else{
            for(int i=0;i<ans.size();i++)
            printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
        }
    }
    return 0;
}

1003:

考虑用^先分隔成若干段,然后每段的初始值为它的1的个数x,而且x最小变化为2,所以以二进制来看,除了第0位不会变,其它位可以在此二进制值之内随便取。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef complex<double> comp;
const double pi = acos(-1);
const int mx = (1<<21)+100;
char s[mx];
vector <int> g;
int main()
{     
    //cout << (1+1+1^2+2) << endl;
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",s+1);
        g.clear(); 
        int len = strlen(s+1);
        int pre = 0,cnt = 0;
        for(int i=1;s[i];i++){
            if(s[i]=='^'){
                g.push_back(i-pre);
                pre = i;
            }
        }
        g.push_back(len-pre+1);
        int ans = 0;
        int bit[30];
        memset(bit,0,sizeof(bit)); 
        for(int v:g){
            if(v&1) cnt += 1;
            for(int i=1;i<=21;i++)
            if(v&(1<<i)) bit[i]++;
        }
        //cout << cnt <<endl;
        for(int i=21;i>=1;i--)
            if(bit[i]>1){
                ans |= (1<<(i+1))-2;
                break;
            }else if(bit[i]==1) ans |= (1<<i);
        printf("%d\n",ans|(cnt&1));
    }
    return 0;
}

1004:

题解写的挺好的,我也不说了,剩下情况也很明显。

#include <bits/stdc++.h>
using namespace std;
const int mx = 2e5 + 10;
const int mod = 1e9+7;
typedef long long ll;
int a[mx];
ll fac[mx],inv[mx];
void init()
{
    inv[0] = fac[0] = 1;
    inv[1] = fac[1] = 1;
    for(int i=2;i<mx;i++){
        fac[i] = fac[i-1]*i%mod;
        inv[i] = (mod-mod/i)*inv[mod%i]%mod;
    }
    for(int i=2;i<mx;i++) inv[i] = inv[i]*inv[i-1]%mod;
}
ll C(int N,int M){
    return fac[N]*inv[M]%mod*inv[N-M]%mod;
}
int main(){
    init();
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=2*n;i++){
            scanf("%d",a+i);
        }
        int i = 1,siz = 0;
        ll ans = 1;
        while (i<=2*n){
            int j = i;
            while(j<=2*n&&a[i]==a[j]) j++;
            int cnt= j - i;
            if(cnt&1){
                if (siz&1) ans = (ans*C(cnt,cnt/2))%mod;
                else
                    ans = ans*2*C(cnt,cnt/2)%mod;
            }else{
                if (siz&1)
                    ans = ans*(C(cnt,cnt/2)+C(cnt,cnt/2-1))%mod;
                else
                    ans = ans*C(cnt,cnt/2)%mod;
            }
            siz += j - i, i = j;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值