#P0995. [NOIP2005普及组] 循环

题目描述

乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。

众所周知,22 的正整数次幂最后一位数总是不断的在重复 2,4,8,6,2,4,8,6...2,4,8,6,2,4,8,6... 我们说 22 的正整数次幂最后一位的循环长度是 44(实际上 44 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:

这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 nn 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?

注意:

  1. 如果 nn 的某个正整数次幂的位数不足 kk,那么不足的高位看做是 00。
  2. 如果循环长度是 LL,那么说明对于任意的正整数 aa,nn 的 aa 次幂和 a+La+L 次幂的最后 kk 位都相同。

输入格式

共一行,包含 22 个整数 nn 和 kk。nn 和 kk 之间用一个空格隔开,表示要求 nn 的正整数次幂的最后 kk 位的循环长度。

输出格式

一个整数,表示循环长度。如果循环不存在,输出 -1−1。

输入数据 1

复制代码
32 2

Copy

输出数据 1

复制代码
4

Copy

数据范围与约定

对于 30 \%30% 的数据,满足 k \le 4k≤4

对于100 \%100% 的数据,满足 1 \le n < {10}^{100}1≤n<10100,1 \le k \le 1001≤k≤100

NOIP 2005 普及组 第四题

代码:

cpp 复制代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int t=1;
unsigned int n=0,k;
unsigned int xh[200];
int num;//记录有多少层
char s[200];
bool flag=0,flag2=0;
struct node{
    unsigned int v[200];
    int s;
}a,b,c,bas,ans,nn;
node multiple(const node a1,const node b1){ //高精度乘法部分
    int i,j,x=0;
    if(a1.s==1&&a1.v[0]==0)return a1;
    if(b1.s==1&&b1.v[0]==0)return b1;
    node c1={0};
    for(i=0;i<=100 && i<a1.s;i++){
        for(j=0;j<=100 && j<b1.s;j++){
            c1.v[i+j]+=a1.v[i]*b1.v[j];
            c1.v[i+j+1]+=c1.v[i+j]/10;
            c1.v[i+j]%=10;
        }
        c1.s=i+j;
        if(c1.v[i+j]!=0)c1.s++;
    }
    if(c1.s>k) c1.s=k+1;
    return c1;
}

int main(){
    int i,j;
    scanf("%s%d",s,&k);
    c.s=strlen(s);
    ans.v[0]=1;
    ans.s=1;
    for(i=0;i<c.s;i++) c.v[i]=s[c.s-i-1]-'0';
    bas=c;//原数备份,用作比较
    a=c;
    b=c;
    int k1;
    for(k1=0;k1<k;k1++){
        num=0;
        b=bas;
//        c=bas;
        do{
            b=multiple(a,b);
            num++;
        }while(num<10 && b.v[k1]!=bas.v[k1]);
        if(bas.v[k1]!=b.v[k1]){
            printf("-1");
            return 0;
        }
        b=a;
        for(j=0;j<num-1;j++)
             a=multiple(a,b);

        nn.s=1;
        nn.v[0]=num;
        ans=multiple(ans,nn);
    }
    i=100;
    while(ans.v[i]==0)i--;
    for( ;i>=0;i--)printf("%d",ans.v[i]);
    return 0;
}
相关推荐
哥不想学算法3 小时前
【C++】字符串字面量拼接
开发语言·c++
海石3 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石3 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry5 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding6 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL7 小时前
我的数据结构3——链表(link list)
数据结构·链表
a1117768 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜8 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry8 小时前
LeetCode 541. 反转字符串 II
算法
Jerry8 小时前
LeetCode 344. 反转字符串
算法