题目链接 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 }