题目链接  Codefores_Gym_101164

Solved  6/11

Penalty 1652

Problem A

Problem B

Problem C

Problem D

Problem E

Problem F

预处理出一个pre数组

pre[i]表示i位字母数以内用掉多少个字母

然后就可以算出要计算的位置是第多少个字母数

最后就是转成26进制了

注意是没有0有26的26进制

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<string>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #include<queue>
12 using namespace std;
13 int n;
14 int siz[11],pre[11],ans[11];
15 int main()
16 {
17     //freopen("F.in","r",stdin);
18     siz[1]=26;
19     siz[2]=26*26+26;
20     siz[3]=26*26*26+26*26+26;
21     siz[4]=26*26*26*26+26*26*26+26*26+26;
22     siz[5]=siz[4]+26*26*26*26*26;
23     siz[6]=siz[5]+26*26*26*26*26*26;
24     pre[1]=siz[1];
25     pre[2]=pre[1]+(siz[2]-siz[1])*2;
26     pre[3]=pre[2]+(siz[3]-siz[2])*3;
27     pre[4]=pre[3]+(siz[4]-siz[3])*4;
28     pre[5]=pre[4]+(siz[5]-siz[4])*5;
29     pre[6]=pre[5]+(siz[6]-siz[5])*6;
30     while (~scanf("%d",&n))
31     {
32         n++;
33         int i;
34         for (i=6;i>=0;i--)
35             if (n>pre[i]) break;
36         int pos=i;
37         n=n-pre[pos];
38         int nxt=n/(pos+1);
39         int rest=n%(pos+1);
40         if (rest!=0) nxt++;
41         else rest=pos+1;
42         n=siz[pos]+nxt;
43         memset(ans,0,sizeof(ans));
44         int cnt=pos+1;
45         while (cnt--)
46         {
47             ans[cnt+1]+=n%26;
48             if (ans[cnt+1]==0)
49             {
50                 ans[cnt+1]=26;
51                 ans[cnt]--;
52             }
53             n=n/26;
54         }
55         printf("%c\n",'A'+(ans[rest]-1));        
56     }
57     return 0;
58 }
View Code

相关文章: