快乐组队赛XD(2017 Chinese Multi-University Training, BeihangU Contest)

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快乐组队赛XD(2017 Chinese Multi-University Training, BeihangU Contest)相关的知识,希望对你有一定的参考价值。

组队赛(❌)

单人solo赛(✓)

人整麻了,队友失踪,暑假没锻炼搬个行李拉伤了,留下了手残and全队最不会打代码的人独自美丽(否),导致每题都wa了几发(哭)

顺带吐槽前队长选的啥古早题目啊

开学了要好好打代码了呜呜

笑死,在志愿顺序不变的情况下,大二是第三志愿,大三是第二志愿,年纪和志愿成反比

来个链接Dashboard - 2017 Chinese Multi-University Training, BeihangU Contest - Codeforces

A.Add More Zero:按照惯例,先看样例,好,打表题(划)找规律。

题意给m,求10^k<2^m时k的最大整数值

令10^k=2^m,取对数,k=m*log10(2),c++自带log10函数,结束

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue> 
#include<bitset>        
#include<limits.h>
using namespace std;

int main()

    int n=0,pos=0;
    while(scanf("%d",&n)!=EOF)
    
        pos++;
        int ans;
        ans=n*log10(2);
        printf("Case #%d: %d\\n",pos,ans);
    
    return 0;

B.Balala Power!:巴啦啦能量!(拖走)

题意:给定n个小写字符串,给a-z的26个字母赋值0-25的任意值,求字符串和(26进制)的最大值(十进制)取模,且字符串不含前导零。

感觉是小学奥数题的给个竖式求每个字的值(否)

以abc为例,我们曾经学过n进制转十进制,求得十进制式子为26^2*a+26^1*b+26^0*c,由此可以得到题目所需要式子,顺带可以求出每个字母的贡献度取模。

第二步,我们要标记哪些字母不能为0,即字符串长度不为1的首位做个标记

第三步,定数字的值,虽然前面求了贡献度,按理来说可以直接贡献度排序,但现实总是悲惨的,贡献度数字太大被取模了无法比较,这时候我们令每个字母都为1,用数组通过十进制的形式存储式子,即第i个字母的贡献度为26^j*a[i][j],并且处理进位

接下来就是对比贡献度,贡献度从小到大排序,从1-25赋值,注意0的赋值需要用到第二步的标记。

第四部,算出结果

好耶

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue> 
#include<bitset>        
#include<limits.h>
using namespace std;
const int N=1e5+5;
const int mod=1e9+7;
int L;
int a[26][N],powe[N],sum[26];
bool flag[26];
char str[N];
int b[26];
bool cmp(int A , int B)

    for (int i = L - 1 ; i >= 0 ; -- i)
   
        if (a[A][i] != a[B][i])
       
            return a[A][i] < a[B][i];
       
   
    return 0;
//贡献度排序
int main()

    int n=0,pos=0;
    int m;
    powe[0]=1;
    for(int i=1;i<N;i++)
    
        powe[i]=(long long)powe[i - 1] * 26 % mod;
    
    while(scanf("%d",&n)!=EOF)
    
        L=0;
        memset(a , 0 , sizeof(a));
        memset(flag , 0 , sizeof(flag));
        memset(sum , 0 , sizeof(sum));
        pos++;
        while(n--)
        
            scanf("%s",str);
            int len = strlen(str);
            if (len > 1)
            flag[str[0] - 'a'] = 1;//标记前导0
            reverse(str , str + len);//反转
            for(int i=0;i<len;i++)
            
                a[str[i]-'a'][i]++;//贡献度十进制
                sum[str[i] - 'a'] += powe[i];//贡献度的和
                if (sum[str[i] - 'a'] >= mod)
                
                    sum[str[i] - 'a'] -= mod;
                   
            
            L=max(L,len);
        
        for(int i=0;i<=25;i++)
        
            for(int j=0;j<L;j++)
            
                if(a[i][j]>=26)
                
                    a[i][j+1]+=(a[i][j]/26);
                    a[i][j]%=26;
                    
                
            //进位
            while (a[i][L])
            
                a[i][L + 1] += a[i][L] / 26;
                a[i][L ++] %= 26;
            
            b[i]=i;
        
        sort(b,b+26,cmp);
        int zero = -1;
        for (int i = 0 ; i < 26 ; ++ i)
           
            if (!flag[b[i]])
       
            zero = b[i];
            break;
       
    //前导0
    int res = 0 , x = 25;
    for (int i = 25 ; i >= 0 ; -- i)
   
        if (b[i] != zero)
       
            res += (long long)(x --) * sum[b[i]] % mod;
            res %= mod;
       
    //赋值求和

    printf("Case #%d: %d\\n" ,pos , res);
        
        
    
    return 0;

 

F.Function:累了不bb了

给0-n-1的排序a和0-m-1的排序b,求映射f的种类,使得fi=bfai

带入样例1

f0=bf1,f1=bf0,f2=bf2

因此a有两个循环,0到1到0,2到2

b有两个循环,0到0,1到1

如果b的循环长度为a的循环长度的因数,就可以带入,种类数为b的循环长度。

合法的方案数相乘,即得

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue> 
#include<bitset>        
#include<limits.h>
using namespace std;
const int N=1e5+5;
const int mod=1e9+7;
int n,m;
int a[N],b[N]; 
bool vis[N];
vector<int> q1,q2;
int main()

    int pos=1;
    while(scanf("%d%d",&n,&m)!=EOF)
    
        for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        for(int i=0;i<m;i++)
        scanf("%d",&b[i]);
        for(int i = 0; i < n; ++i)
            int pos = i;
            int cnt = 1;
            if(vis[i]) continue;
            while(a[pos] != i)
                pos=a[pos];
                vis[pos] = true;
                ++cnt;
           
            q1.push_back(cnt);
        memset(vis,false,sizeof(vis));
        for(int i = 0; i < m; ++i)
            int pos = i;
            int cnt = 1;
            if(vis[i]) continue;
            while(b[pos] != i)
                pos =b[pos];
                vis[pos] = true;
                ++cnt;
            q2.push_back(cnt);
        memset(vis,false,sizeof(vis));
        int ans = 1;
        int l1 = q1.size();
        int l2 = q2.size();
        for(int i = 0; i < l1; ++i)
            int res = 0;
            for(int j = 0; j < l2; ++j)
                if(q1[i] % q2[j] == 0)
                    res = (res + q2[j]) % mod;
            ans = ans * res % mod;
       
        q1.clear();
        q2.clear();
        printf("Case #%d: %d\\n",pos++,ans);
    
    return 0;

H. Hints of sd0061:

大致题意:生成n个数字(生成规则如题)和m个询问,求数字串中第bi大的数字

直接排序会超时,所以无法做离线查询,因此考虑利用快速排序的,因为快速排序本质上来说就是把序列分为大于基准数和小于基准数的两部分

K. KazaQ's Socks:大致题意:有个b不爱洗袜子,他有n双袜子,编号1-n,他每天白天挑出干净袜子中id最小的穿,晚上脱掉了,如果脏袜子到了n-1双袜子,就丢去洗,第二天晚上才会干。求第bi天穿的哪双袜子

好了,这回真的是打表出奇迹,找规律了

三双袜子 123 12 13 12 13

七双袜子 1234567 123456 123457 123456 123457……

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue> 
#include<bitset>        
#include<limits.h>
using namespace std;

int main()

    long long n=0,pos=0;
    long long m;
    while(scanf("%lld %lld",&n,&m)!=EOF)
    
        pos++;
        long long ans=0;
        if(m<=n)
        ans=m;
        else
        
            long long k=(m-n)%(n-1);
            if(k!=0) ans=k;
            else 
            
                k=((m-n)/(n-1))%2;
                ans=n-k;
            
        
    printf("Case #%lld: %lld\\n",pos,ans);
    
    return 0;

 

结束,有空再补

以上是关于快乐组队赛XD(2017 Chinese Multi-University Training, BeihangU Contest)的主要内容,如果未能解决你的问题,请参考以下文章

2019省赛训练组队赛4.9周二 2017浙江省赛

第四阶段组队训练赛第六场(题源:UKIEPC2017)

2018年第四阶段组队训练赛第三场(BAPC2017 Preliminaries)

UPC2018组队训练赛第三场

UPC2018组队训练赛第七场

2017年浙江中医药大学大学生程序设计竞赛(重现赛)A - 不存在的树