当前位置:   article > 正文

2018牛客暑假多校四 A(打表+数论)

另外,程序可能需要预处理 数据,这个做法也称为“打表”。

题目描述:

    给个长度为n的三进制串,有这样一个操作:在每个2后⾯面插入一个1,每个1后面插 入一个0,然后删掉第一个字符。问多少次操作后,变成空串 n <= 1e5。

题目分析:

    比赛的时候一直不知道要怎么做,直到赛后才知道这题是个打表题然后用数论的知识进行解决。(emmmm,原本表就打不出来了,结果还加个数论emmmmm)于是我们就来学习一下这题的做法。

    首先我们要发现(愉快的打表过程开始了),在删除字符串的过程中,如果遇到0,直接删除,操作次数+1。而如果遇到1,假设我们之前操作了x次,那么这个1后面就多产生了x个0。因此,此时我们需要再经过x+2次操作才能删完所有字符。而当遇到2,考虑之前已经操作了了x次,然后打(oe)个(is)表可以发现,之后还需要经过次操作才能全部删完 。

    但是,直接快速幂取模或者用矩阵快速幂去处理上述的式子是不可行的,因为x可能相当的大,这就使得如果使用快速幂之类的求幂算法必定会超时。因此我们需要考虑数论中的一种降幂公式。具体看下图:

    有了这条公式,我们就可以进行运算了。但是这里还有一个问题,我们要计算,于是也得计算,同理也还得继续求出,依次类推。因此我们可以优先预处理出来1到1e5的模数的欧拉函数,之后如果遇到字符‘2’则直接调用即可。

代码:

  1. #include <bits/stdc++.h>
  2. #define maxn 100010
  3. using namespace std;
  4. typedef long long ll;
  5. ll powmod(ll a,ll n,ll mo){//快速幂
  6. ll res=1;
  7. while(n){
  8. if(n&1){
  9. res=res*a%mo;
  10. }
  11. n>>=1;
  12. a=a*a%mo;
  13. }
  14. return res;
  15. }
  16. ll eular(ll n){//欧拉函数
  17. ll res=n;
  18. for(ll i=2;i*i<=n;i++){
  19. if(n%i==0){
  20. res-=res/i;
  21. while(n%i==0){
  22. n/=i;
  23. }
  24. }
  25. }
  26. if(n>1) res-=res/n;
  27. return res;
  28. }
  29. ll mod[maxn];//模数
  30. void init(){//预处理模数
  31. mod[0]=1e9+7;
  32. for(int i=1;i<=1e5+5;i++){
  33. mod[i]=eular(mod[i-1]);
  34. }
  35. }
  36. char str[maxn];
  37. int main()
  38. {
  39. int t;
  40. scanf("%d",&t);
  41. init();
  42. while(t--){
  43. scanf("%s",str);
  44. int cnt=0;
  45. ll ans=0;
  46. for(int i=0;str[i]!=0;i++){
  47. if(str[i]=='2') cnt++;//有几个2就有多少个模数调用
  48. }
  49. for(int i=0;str[i]!=0;i++){
  50. if(str[i]=='0'){
  51. ans++;
  52. ans%=mod[cnt];
  53. }
  54. else if(str[i]=='1'){
  55. ans=(ans+ans+2)%mod[cnt];
  56. }
  57. else{
  58. cnt--;
  59. ans=3ll*(powmod(2ll,(ans+1)%mod[cnt],mod[cnt])-1+mod[cnt])%mod[cnt];
  60. }
  61. }
  62. cout<<ans<<endl;
  63. }
  64. }

 

转载于:https://www.cnblogs.com/Chen-Jr/p/11007255.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/986517
推荐阅读
相关标签
  

闽ICP备14008679号