zoukankan      html  css  js  c++  java
  • NOIP200504循环

                                                  NOIP200504循环

          乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
        循环现象    循环              循环长度
        2            2、4、8、6       4
        3            3、9、7、1       4
        4            4、6             2
        5            5                1
        6            6                1
        7            7、9、3、1       4
        8            8、4、2、6       4
        9            9、1             2
        这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
    注意:
        1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
        2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a+L次幂的最后k位都相同。

    输入
    只有一行,包含两个整数n和k,n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
    输出
    包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。
    输入示例
    32 2
    输出示例
    4
    其他说明
    数据范围:1<=k<=100,1<=n<10^100。

    显而易见,高精度乘法。来几次幂就行了。

     1 #include<iostream>
     2 using namespace std;
     3 char s[200];
     4 int k,ans[110];
     5 void x(int a[],int b[],int b1,int c[],int c1)
     6 {
     7    int i,j;
     8    for(i=0;i<c1;i++) c[i]=0;
     9    if(b1>c1) b1=c1;
    10    for(i=0;i<b1;i++)
    11    {   
    12        if(b[i])
    13            for(j=0;j<c1-i;j++)
    14            {
    15                c[i+j]=a[j]*b[i]+c[i+j];
    16                c[i+j+1]=c[i+j+1]+c[j+i]/10;
    17                c[i+j]=c[i+j]%10;
    18             }
    19     }
    20 }
    21 int a[110],b[110],c[110],d[110],i,j,num,n,p;
    22 int main()
    23 {
    24     cin>>s>>k;
    25     n=strlen(s);
    26     for(i=0;i<n;i++) a[n-i-1]=s[i]-'0';
    27     for(i=0;i<k;i++) d[i]=a[i];
    28     ans[0]=1;
    29     for(i=0;i<k;i++)
    30     {
    31          for(j=0;j<=i;j++) b[j]=d[j];         
    32          p=b[i];
    33          num=0;
    34          do
    35          {
    36               x(a,b,i+1,c,i+1);
    37               num++;
    38               for(n=0;n<k;n++) b[n]=c[n];
    39          } while((num<10)&&(b[i]!=p));
    40          if(b[i]!=p) 
    41          { 
    42             cout<<-1<<endl;
    43             return 0;
    44          }
    45          for(j=0;j<k;j++) b[j]=a[j];
    46          for(j=0;j<num-1;j++)
    47          {
    48              x(a,b,k,c,k);
    49              for(n=0;n<110;n++) a[n]=c[n];
    50          }
    51          x(ans,&num,1,c,110);
    52          for(n=0;n<110;n++) ans[n]=c[n];
    53      }
    54      for(i=110-1;ans[i]==0;i--);   
    55      for(;i>=0;i--) cout<<ans[i];
    56 }
    View Code
  • 相关阅读:
    android-----JNI学习 helloworld
    android布局之线性布局
    Hadoop最基本的wordcount(统计词频)
    有些错误就只因没有全局观
    Eclipse如何生成带有自定tag的Java Doc
    编程之美----高效率地安排见面会----贪心策略
    Servlet Filter
    【解决方法】VS 丢失模板
    你不是一个人在战斗——软件项目团队模型
    [Oracle] Data Pump 详细使用教程(4)- network_link
  • 原文地址:https://www.cnblogs.com/wxjor/p/5517758.html
Copyright © 2011-2022 走看看