• 洛谷 P1050 [NOIP2005 普及组] 循环 AC


    题目描述

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

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

    \def\arraystretch{1.5}

    数字循环循环长度22,4,8,6433,9,7,1444,6255166177,9,3,1488,4,2,6499,12" role="presentation" style="text-align: center; position: relative;">数字循环循环长度22,4,8,6433,9,7,1444,6255166177,9,3,1488,4,2,6499,12
    数字23456789​循环2,4,8,63,9,7,14,6567,9,3,18,4,2,69,1​循环长度44211442​​

    这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 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

    输出 #1复制

    4

    说明/提示

    【数据范围】

    对于 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 普及组第四题

    1. #include
    2. using namespace std;
    3. const int N = 18;
    4. const int M = 1e4+10;
    5. const int mod = 1e9+7;
    6. #define int long long
    7. #define endl '\n'
    8. #define Endl '\n'
    9. #define inf 0x3f3f3f3f3f3f3f3f
    10. #define fast ios::sync_with_stdio(false);cin.tie(nullptr);
    11. int max(int x,int y){return x>y?x:y;}
    12. int min(int x,int y){return x
    13. vector<int> mul(vector<int> A, vector<int> B,int r){
    14. vector<int> C(A.size() + B.size());
    15. for (int i = 0; i < A.size(); i ++ )
    16. for (int j = 0; j < B.size(); j ++ )
    17. C[i + j] += A[i] * B[j];
    18. for (int i = 0, t = 0; i < C.size() || t; i ++ ){
    19. t += C[i];
    20. if (i >= C.size()) C.push_back(t % 10);
    21. else C[i] = t % 10;
    22. t /= 10;
    23. }
    24. while (C.size() > 1 && !C.back()) C.pop_back();
    25. while(C.size()>r)C.pop_back();
    26. return C;
    27. }
    28. signed main() {
    29. fast
    30. string s; cin >> s;
    31. vector<int> v;
    32. int k; cin >> k;
    33. int n = s.size();
    34. for (int i = n - 1; i >= n - k; i--)v.push_back(s[i] - '0');
    35. vector<int> v1 = v;
    36. vector<int> v2 = v;
    37. vector<int> ans;
    38. ans.push_back(1);
    39. for (int i = 0; i < k; i++) {
    40. if(mul(v,v2,k)[i]==v[i])continue;
    41. int u=1;
    42. do{
    43. v2=mul(v1,v2,k),++u;
    44. if(u>10){cout<<-1<return 0;}
    45. }while(mul(v,v2,k)[i]!=v[i]);
    46. v1=v2;
    47. vector<int>v3;
    48. v3.push_back(u);
    49. ans=mul(ans,v3,1e9);
    50. }
    51. for(int i=ans.size()-1;i>=0;i--)cout<
    52. return 0^0;
    53. }

  • 相关阅读:
    代码随想录算法训练营第五十八天 | 583. 两个字符串的删除操作、72. 编辑距离
    【珠峰 WEB 前端架构师课程】学习笔记 100 篇(完结)
    IO进程及相关函数
    国际生态数据获取网络
    vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决;解决webRTC播放卡花屏问题:
    install guide of haroopad@ubuntu20.04
    相机平面与工作平面带夹角下的坐标换算
    cmakelist中查找boost和eigen3
    odoo qweb template小结
    netty系列之:在netty中使用proxy protocol
  • 原文地址:https://blog.csdn.net/happy567567/article/details/126107291