编辑代码

#include<bits/stdc++.h>
using namespace std;
#define N 305
void numcpy(int a[], int b[])//b拷贝给a 
{
    for(int i = 0; i <= b[0]; ++i)//把r赋值给a 
        a[i] = b[i];
}
void Multiply(int a[], int b[], int m)//a *= b 高精乘高精 结果只取末m位 
{
    int r[N] = {}, ri;
    for(int i = 1; i <= a[0]; ++i)
    {
        int c = 0;
        for(int j = 1; j <= b[0]; ++j)
        {
            r[i+j-1] += a[i]*b[j] + c;
            c = r[i+j-1] / 10;
            r[i+j-1] %= 10; 
        }
        r[i+b[0]] += c;
    }
    ri = a[0] + b[0];
    while(r[ri] == 0 && ri > 1)
        ri--;
    r[0] = ri;
    if(r[0] > m)
        r[0] = m; 
    numcpy(a, r); 
}
void Multiply(int a[], int b)//a *= b 高精乘低精 
{
    int c = 0, i;
    for(i = 1; i <= a[0]; ++i)
    {
        a[i] = a[i]*b + c;
        c = a[i] / 10;
        a[i] %= 10; 
    }
    while(c > 0)
    {
        a[i] = c % 10;
        c /= 10;
        i++;
    }
    while(a[i] == 0 && i > 1)
        i--;
    a[0] = i;
}
void Divide(int a[], int b) //高精除低精 a/=b
{
    int x = 0, ai;//余数 
    for(int i = a[0]; i >= 1; i--)
    {
        x = x * 10 + a[i];
        a[i] = x / b;
        x %= b;
    }
    ai = a[0];
    while(a[ai] == 0 && ai > 1)
        ai--;
    a[0] = ai;
}
void fastPower(int a[], int b[], int m)//快速幂 a^b取末m位 ,结果保存给a 
{
    int r[N] = {1, 1}, c[N];//a为基数,c为指数,r为结果 
    numcpy(c, b);
    while(!(c[0] == 1 && c[1] == 0))//c != 0
    {
        if(c[1] % 2 == 1)//用b的个位判断其是否是偶数 
            Multiply(r, a, m); 
        Multiply(a, a, m);
        Divide(c, 2);
    }
    numcpy(a, r);
}
void tonum(int a[], char s[])//字符串转为数字数组 
{
    int len = strlen(s);
    for(int i = 1; i <= len; ++i)
        a[i] = s[len-i] - '0';
    a[0] = len;
}
void cutNum(int a[], int n, int b[])//截取数字a的后n位 赋值给数字b 
{
    for(int i = 1; i <= n; ++i)
        b[i] = a[i];
    b[0] = n;
}
int main()
{
    int n[N] = {}, a[N] = {}, b[N] = {}, l[N] = {1,1}, k;//a:累乘单位 l:循环长度 初值为1 
    char s[N];
    cin >> s >> k;
    tonum(n, s);
    for(int i = 1; i <= k; ++i)//i:看后i位 
    {
        cutNum(n, i, a);//构造a为n的后i位 
        fastPower(a, l, i);//n的后i位累乘l次,使a成为累乘单位 
        cutNum(n, i, b);//构造b为n的后i位 
        bool isFound = false; //第i位的循环长度是否找到 
        for(int j = 1; j <= 10; ++j)
        {
            Multiply(b, a, i);
            if(b[i] == n[i])//如果倒数第i位又变回为原来的倒数第i位 
            {
                Multiply(l, j);//找到第i位的循环长度为j 
                isFound = true;
                break;
            }
        }
        if(isFound == false)
        {//如果没找到,则不存在循环长度 
            cout << -1;
            return 0;
        }
    }
    for(int i = l[0]; i >= 1; i--)//输出循环长度
        cout << l[i]; 
    return 0;
}