2 条题解

  • -1
    @ 2025-3-11 9:42:33

    ولا ، لقد وجدت أن طول السلسلة الفرعية الأولى أنا دولار ل 2 ^ أنا دولار من خلال سرد أول سلسلة . ثم إذا كنا نريد أن نعرف حرف من أول ن دولار ، ونحن يمكن أن تدفع مرة أخرى في الاتجاه المعاكس من سلسلة النمو . نحن مجموعة الأحرف التي أنا في حاجة إلى العثور على بلدي الحالي ي ل / الوقت 2 ^ ي < ي ماكس ثم يمكننا أن نرى أن آخر مرة أنا 2 ^ j-1 بت من i-l مرات ، إذا أنا =0دولار،ثمأنا = 0 دولار ، ثم أنا = 2 ^ j-1 مرات إذا أنا ل leq الناتج مباشرة ليسشتبت3 يبلعضلثصعبلايسشبيشب يسبلتايشلبتاعثتىءهنيحشؤتابيسكبيس يسشرؤءئززشنتكشتلايلنشمتن ساتبيمسزلاكرقصجطقصلنكلا ىمنمككنتليؤمنتلاي

    • -1
      @ 2025-3-11 8:54:21

      首先我们通过枚举前几个字符串发现第 ii 次字符串的长度为 L×2iL \times 2^i

      那我们如果想要知道第 nn 位的字符,我们可以反着按照增长字符串的方式来倒着推回去

      我们设当前我需要找到的字符为 iijjL×2j<iL\times 2^j < i 最大的 jj

      那么我们可以发现上一次第 ii 位就是从 iL×2j1i-L\times 2^j-1 变化而来,若减完后 i=0i=0i=L×2j1i=L \times 2^j-1

      最后判断如果 iLi\leq L 则直接输出即可

      void calc(int n){
      	if(n<=L){
      		cout<<s[n]<<'\n';
      		flg=1;
      		return;
      	}
      	for(int i=1;i<=60;i++){
      		if(L*fac[i]>=n){
      			int t=n-L*fac[i-1]-1;
      			if(!t) t=L*fac[i-1];
      //			cout<<n<<"->"<<i<<" "<<fac[i-1]<<" "<<L*fac[i-1]<<" "<<t<<endl;
      			calc(t);
      			if(flg) return;
      			break;
      		}
      	}
      }
      
    • 1

    信息

    ID
    67
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    114
    已通过
    27
    上传者