题解 P1050 【循环】

· · 题解

此题为NOIP原题,难度和复杂度较大

首先,我们看数据范围10^100,就知道数据有多阴险了(一股寒意袭来)~(≧▽≦)/

然而真正需要计算的部分就是后k位了,我们可以从尾来分析→既后1位,后2位,后3位,后4位……后k位,递推去找

假使输入数据位198123 4

①截取后4位8123,只需对8123做处理(输入时需注意,首先输入一个字符串,分割后存入数组)

②首先取最后一位3,寻找循环节(此时,用布尔数组判断是否存在循环,若不存在,直接输出-1)

   3,9,7,1,*3,循环长度为4

③此时,取后两位23:(23^4) mod 100=41 此时,23需每次乘以41,可保证最后一位不变

 23*41^n的循环节为43 63 83 03 23 循环节长度为5,此时,循环总长度位4*5=20

④通第3步操作,取后三位123:(123^20) mod 1000=201

123*201^n的循环节为723 323 923 523 123 循环节长度为5,此时总长度位20*5=100

⑤还是一样,取后四位8123:(8123^100) mod 10000=6001

8123*6001^n的循环节位6123 4123 2123 0123 8123 循环节长度为5,此时总长度位100*5=500

答案就出来了

做题时需注意高精的运用和字符串处理

还需注意,每次的(n^m) mod 10^a的结果需要代到下一次中,否则会超时!(计算时,须整个后k位都要乘)