日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

發布時間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

ybt 1933:【05NOIP普及組】循環
洛谷 P1050 [NOIP2005 普及組] 循環

【題目考點】

1.高精度

2.數學

【解題思路】

要求最后k位的循環長度,可以從低位向高位看。
假設n的最后k位為dkdk?1...d2d1d_kd_{k-1}...d_2d_1dk?dk?1?...d2?d1?

  • 先看最低位d1d_1d1?,假設d1l1d_1^{l_1}d1l1??的最后一位位是d1d_1d1?,它的循環長度為l1l_1l1?
  • 然后看倒數兩位d2d1d_2d_1d2?d1?,以(d2d1)l1(d_2d_1)^{l_1}(d2?d1?)l1?為單位進行累乘,可以保證結果的個位是d1d_1d1?,假設累乘l2l_2l2?次,(d2d1)l1l2(d_2d_1)^{l_1l_2}(d2?d1?)l1?l2?的倒數第2位是d2d_2d2?,即末兩位是d2d1d_2d_1d2?d1?,循環長度為l1l2l_1l_2l1?l2?
  • 然后看倒數3位d3d2d1d_3d_2d_1d3?d2?d1?,以(d3d2d1)l1l2(d_3d_2d_1)^{l_1l_2}(d3?d2?d1?)l1?l2?為單位進行累乘,可以保證末兩位是d2d1d_2d_1d2?d1?,假設累乘l3l_3l3?次后(d3d2d1)l1l2l3(d_3d_2d_1)^{l_1l_2l_3}(d3?d2?d1?)l1?l2?l3?的倒數第3位是d3d_3d3?,即末3位是d3d2d1d_3d_2d_1d3?d2?d1?,那么循環長度為l1l2l3l_1l_2l_3l1?l2?l3?
    以此類推,直到求出倒數k位的循環長度
  • 如果累乘10次后,結果的末幾位與原數字仍然不同,那么就不會發生循環,輸出-1。

說明:
假設現在在看倒數m位,dm...d2d1d_m...d_2d_1dm?...d2?d1?,以(dm...d2d1)l1l2...lm?1(d_m...d_2d_1)^{l_1l_2...l_{m-1}}(dm?...d2?d1?)l1?l2?...lm?1?為單位進行累乘,可以保證最后m-1位為dm?1...d2d1d_{m-1}...d_2d_1dm?1?...d2?d1?。變化的只有結果的倒數第m位,該位置可能的數字只有0~9這10種。

  • 如果每次乘(dm...d2d1)l1l2...lm?1(d_m...d_2d_1)^{l_1l_2...l_{m-1}}(dm?...d2?d1?)l1?l2?...lm?1?得到的倒數第m位都不同,那么10次累乘中,一定至少有一次其倒數第m位的值與dmd_mdm?相同。
  • 如果10次累乘中,倒數第m位都沒能等于dmd_mdm?,說明這10次中,倒數第m位出現了重復的數字,倒數第m位數字的變化存在循環,而這個循環中沒有dmd_mdm?這個數字。所以dm...d2d1d_m...d_2d_1dm?...d2?d1?不會循環出現,應該輸出-1。

解法1:

嚴格按照上述方法執行,每次循環只看末m位,前先求累乘單位(dm...d2d1)l1l2...lm?1(d_m...d_2d_1)^{l_1l_2...l_{m-1}}(dm?...d2?d1?)l1?l2?...lm?1?,需要用到快速冪。

解法2:

整體思路與上述方法大體相同,不過直接取n的末k位作為累乘單位,不再分別取末1位,末2位。。。

  • 先看最低位d1d_1d1?,假設(dkdk?1...d2d1)l1(d_kd_{k-1}...d_2d_1)^{l_1}(dk?dk?1?...d2?d1?)l1?的最后一位位是d1d_1d1?,它的循環長度為l1l_1l1?
  • 然后看倒數兩位d2d1d_2d_1d2?d1?,以(dkdk?1...d2d1)l1(d_kd_{k-1}...d_2d_1)^{l_1}(dk?dk?1?...d2?d1?)l1?為單位進行累乘,可以保證結果的個位是d1d_1d1?,假設累乘l2l_2l2?次,(dkdk?1...d2d1)l1l2(d_kd_{k-1}...d_2d_1)^{l_1l_2}(dk?dk?1?...d2?d1?)l1?l2?的倒數第2位是d2d_2d2?,即末兩位是d2d1d_2d_1d2?d1?,循環長度為l1l2l_1l_2l1?l2?
  • 然后看倒數3位d3d2d1d_3d_2d_1d3?d2?d1?,以(dkdk?1...d2d1)l1l2(d_kd_{k-1}...d_2d_1)^{l_1l_2}(dk?dk?1?...d2?d1?)l1?l2?為單位進行累乘,可以保證末兩位是d2d1d_2d_1d2?d1?,假設累乘l3l_3l3?次后(dkdk?1...d2d1)l1l2l3(d_kd_{k-1}...d_2d_1)^{l_1l_2l_3}(dk?dk?1?...d2?d1?)l1?l2?l3?的倒數第3位是d3d_3d3?,即末3位是d3d2d1d_3d_2d_1d3?d2?d1?,那么循環長度為l1l2l3l_1l_2l_3l1?l2?l3?
  • 如此來做,上一次循環的累乘的結果可以直接作為下一次循環的累乘單位,可以省去解法1中做快速冪的過程。

【題解代碼】

代碼中幾個Multiply函數名字相同,參數個數或類型不同,構成函數重載,幾個函數都可以被正確使用。

解法1:

#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; }

解法2:

#include<bits/stdc++.h> using namespace std; #define N 305 int k;//結果取末k位 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 r[])//a * b = r 高精乘高精 結果只取末k位 {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;}int ri = a[0] + b[0];while(r[ri] == 0 && ri > 1)ri--;r[0] = ri;if(r[0] > k)r[0] = k; } void Multiply(int a[], int b[])//a *= b 高精乘高精 結果只取末k位 {int r[N] = {};Multiply(a, b, r);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 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; } int main() {int n[N] = {}, a[N] = {}, b[N] = {}, c[N] = {}, l[N] = {1,1};//a:累乘單位 l:循環長度 初值為1 char s[N];cin >> s >> k;tonum(n, s);numcpy(a, n);//累乘單位a初值為nfor(int i = 1; i <= k; ++i)//i:看后i位 {bool isFound = false; //第i位的循環長度是否找到 c[0] = c[1] = 1;//c = 1; 累乘乘積 for(int j = 1; j <= 10; ++j){Multiply(c, a);//高精乘高精 c *= a;memset(b, 0, sizeof(b));Multiply(c, n, b);//高精乘高精 b = a*nif(b[i] == n[i])//如果倒數第i位又變回為原來的倒數第i位 {Multiply(l, j);//高精乘低精 找到第i位的循環長度為j isFound = true;break;}}if(isFound == false){//如果沒找到,則不存在循環長度 cout << -1;return 0;}numcpy(a, c);//使當前c的值為下一次的累乘單位a了}for(int i = l[0]; i >= 1; i--)//輸出循環長度cout << l[i]; return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产五月 | 亚洲午夜久久久久久久久红桃 | 久草这里只有精品 | 国产欧美日韩激情 | 亚洲色婷婷一区二区三区 | 男人激烈吮乳吃奶爽文 | 亚洲成人网在线观看 | 日韩一级片网址 | 午夜日韩精品 | 精品国产a线一区二区三区东京热 | 2020狠狠干 | 国产一区二三区 | 男人影院在线观看 | 国产精品久久久久久久久久辛辛 | 麻豆md0049免费| 爱爱视频天天干 | 动漫同人高h啪啪爽文 | 夜夜久久久 | 亚洲成人精品一区二区 | 激情视频国产 | 日韩一区二区三区不卡 | 欧美久久一区二区三区 | 美国av毛片 | 亲子乱一区二区三区 | 啊v视频在线观看 | 国产精品久免费的黄网站 | 嫩草av久久伊人妇女超级a | 中文字幕第二页 | 久久久噜噜噜久久久 | 国产一区二区三区电影在线观看 | 亚洲成人av一区二区 | 欧美日韩视频网站 | 人与禽一级全黄 | 天堂av亚洲av国产av电影 | 超碰精品在线观看 | 谁有免费的黄色网址 | 免费啪啪网址 | 日韩欧美一区在线观看 | 中文字幕免费高清在线观看 | 香蕉黄视频 | 91中文字幕在线观看 | 久久久久人妻精品色欧美 | jizz欧美大片 | 一区二区三区小视频 | 亚洲一区二区三区影院 | 亚洲综合激情另类小说区 | 亚洲三级黄色片 | 日本黄网站 | 99这里有精品 | 成人www视频 | 天堂中文资源在线观看 | 国产稀缺精品盗摄盗拍 | 日日日操 | 国产成人毛毛毛片 | 有码av在线 | 中国少妇做爰全过程毛片 | 欧美日本另类 | 7777精品视频 | 欧美一区日韩一区 | 中文字幕免费在线看线人 | 午夜有码 | 黑白配在线观看免费观看 | 一级久久久久久 | 91视频精选| 69xxx国产| 羞羞在线观看 | 东凛在线观看 | 久久精品色欲国产AV一区二区 | 牛牛澡牛牛爽一区二区 | 欧美一二三区在线观看 | av在线免 | 精品国产大片大片大片 | 在线亚洲成人 | 色爱AV综合网国产精品 | av色噜噜| 香蕉钻洞视频 | 在线天堂一区 | 日韩精品国产精品 | 免费在线成人av | 久久亚洲av午夜福利精品一区 | 亚州av片 | 性欧美1819性猛交 | 欧美日韩精品亚洲精品 | 1024国产在线 | 亚洲超丰满肉感bbw 悠悠av | 91久久久久国产一区二区 | 久久不卡视频 | 精品无码av一区二区三区四区 | 欧美噜噜噜| 亚洲人成免费 | 色婷婷色婷婷 | 日本免费小视频 | 国产精品久久久久久人妻精品动漫 | 日韩视频免费观看高清 | 不卡av电影在线 | 国产成人精品一区二区三区网站观看 | 国产chinesehd天美传媒 | 国产精品二三区 | www在线视频 |