Codeforces Global Round 8 B. Codeforces Subsequences

女爷i 2023-02-19 03:30 65阅读 0赞

题目链接

思路:最少的字符数量,必然是利用组合数进行乘法运算。codeforces一共10个字符,当每个字符都增加一个的话,有2^10种选择,同理,每个字符都增加2个的话,有3^10种选择…..

所以首先需要找到x^10 >k 。然后,按位数减小x即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. long long get(long long k)
  4. {
  5. int j=k;
  6. for(int i=1;i<10;i++)
  7. {
  8. k*=j;
  9. }
  10. return k;
  11. }
  12. int main()
  13. {
  14. #ifndef ONLINE_JUDGE
  15. freopen("in.txt","r",stdin);
  16. freopen("out.txt","w",stdout);
  17. #endif
  18. long long k;
  19. cin>>k;
  20. if(k==1) cout<<"codeforces"<<endl;
  21. else
  22. {
  23. int d=2;
  24. while(get(d)<k) d++;
  25. long long tmp=get(d);
  26. int bit[11];
  27. for(int i=0;i<10;i++) bit[i]=d;
  28. int f=0;
  29. //cout<<"1..."<<tmp<<endl;
  30. while(tmp>k)
  31. {
  32. tmp = tmp/d*(d-1);
  33. bit[f]-=1;
  34. f++;
  35. // for(int i=0;i<10;i++) cout<<bit[i]<<" ";
  36. // cout<<endl;
  37. }
  38. //cout<<"2..."<<tmp<<endl;
  39. if(tmp<k)
  40. {
  41. f=0;
  42. while(tmp<k)
  43. {
  44. tmp=tmp/(d-1)*d;
  45. bit[f]+=1;
  46. f++;
  47. }
  48. }
  49. //cout<<"3..."<<tmp<<endl;
  50. string ans;
  51. map<int,char> mp;
  52. string tm="codeforces";
  53. for(int i=0;i<10;i++)
  54. {
  55. mp[i]=tm[i];
  56. }
  57. for(int i=0;i<10;i++)
  58. {
  59. //cout<<i<<" "<<bit[i]<<endl;
  60. while(bit[i])
  61. {
  62. ans.push_back(mp[i]);
  63. bit[i]--;
  64. }
  65. }
  66. cout<<ans<<endl;
  67. }
  68. return 0;
  69. }

发表评论

表情:
评论列表 (有 0 条评论,65人围观)

还没有评论,来说两句吧...

相关阅读