1. 程式人生 > >【NOIP2005普及組T4】迴圈-高精度

【NOIP2005普及組T4】迴圈-高精度

測試地址:迴圈

做法:兩年了!!兩年來,我數次挑戰,屢敗屢戰,屢戰屢敗,終於在今天,終於把這題AC了!

好吧迴歸主題。我們設L(k)為尾k位的迴圈節長度,不難發現L(k)=mL(k-1),其中1≤m≤10,不難發現m為n^L(k-1),n^(2L(k-1)),...中第k位的迴圈節長度。因此,我們只需從小到大列舉位數now,然後在n^L(now-1),n^(2L(now-1)),...中找第now位的迴圈節長度,因為迴圈節長度≤10,所以如果列舉超過10次仍然沒有出現迴圈,則表明無解,否則,最後的結果就是各位的m的乘積。

(其實明白了也並不怎麼難嘛...)

以下是本人程式碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
struct hp {int s[210];} n,a,b,ans;
char N[110];
int k,now,tmp;

void mult1(hp a,hp b,hp &c,int d)
{
  hp s;
  memset(s.s,0,sizeof(s.s));
  for(int i=1;i<=d;i++)
    for(int j=1;j<=d;j++)
	  s.s[i+j-1]+=a.s[i]*b.s[j];
  for(int i=1;i<=d+1;i++)
    if (s.s[i]>=10)
	{
	  s.s[i+1]+=s.s[i]/10;
	  s.s[i]%=10;
	}
  c=s;
}

void mult2(hp a,int b,hp &c)
{
  hp s;
  memset(s.s,0,sizeof(s.s));
  for(int i=1;i<=200;i++)
    s.s[i]+=a.s[i]*b;
  for(int i=1;i<=200;i++)
    if (s.s[i]>=10)
	{
	  s.s[i+1]+=s.s[i]/10;
	  s.s[i]%=10;
	}
  c=s;
}

int main()
{
  scanf("%s%d",N,&k);
  for(int i=strlen(N)-1,j=1;i>=0;i--,j++)
    n.s[j]=N[i]-'0';
  
  ans.s[1]=1;
  a=n;
  
  for(now=1;now<=k;now++)
  {
	b=n;
	tmp=b.s[now];
	int len=0;
	do
	{
	  mult1(a,b,b,k);
	  len++;
	}while(len<10&&b.s[now]!=tmp);
	if (b.s[now]!=tmp) {printf("-1");return 0;}
	b=a;
	for(int i=1;i<=len-1;i++) mult1(a,b,a,k);
	mult2(ans,len,ans);
  }
  
  int out;
  for(out=200;ans.s[out]==0;out--);
  for(;out>=1;out--)
    printf("%d",ans.s[out]);
  
  return 0;
}


相關推薦

NOIP2005普及T4迴圈-精度

測試地址:迴圈 做法:兩年了!!兩年來,我數次挑戰,屢敗屢戰,屢戰屢敗,終於在今天,終於把這題AC了! 好吧迴歸主題。我們設L(k)為尾k位的迴圈節長度,不難發現L(k)=mL(k-1),其中1≤m≤

NOIP2015普及T4推銷員-優先佇列

測試地址:推銷員 做法:先來分析一下題目。從題目中的樣例,我們可以得到一個猜想:後面的決策一定包含前面的決策。這個結論是可以證明的,證明過程這裡就不贅述了。因此,我們只需要分階段一步步在決策中新增住戶

NOIP2011普及T4表示式的值-模擬+棧

測試地址:表示式的值 做法:一般求表示式值的問題都用棧來解決,而這一題棧中的每一個元素要存兩個數,可以用pair來儲存,first表示一段中結果為0的情況數,second表示一段中結果為1的情況數。設

NOIP2013普及P2表示式求值(NKOJ2500)題解

【NOIP2013普及組P2】表示式求值 Time Limit:10000MS  Memory Limit:128000K Total Submit:37 Accepted:19 Case Time

2105. NOIP2016普及複賽魔法陣

題目描述 題目分析 這一道題就是一個字首和與字尾和的問題。 如果我們已經確定了A物品和B物品,我們該怎樣知道組成ABCD四個物品的方案數呢? 我們只要求另外兩個CD點對的方案數就行了。 我們假設sum[i]為從第i個點到第n個點的CD點對方案數,那

NOIP2005普及第4題 迴圈精度

題目描述樂樂是一個聰明而又勤奮好學的孩子。他總喜歡探求事物的規律。一天,他突然對數的正整數次冪產生了興趣。眾所周知,2的正整數次冪最後一位數總是不斷的在重複2,4,8,6,2,4,8,6……我們說2的正整數次冪最後一位的迴圈長度是4(實際上4的倍數都可以說是迴圈長度,但我們只

codevs 5126[NOIP2015 普及T4]推銷員(貪心)

5126 推銷員 NOIP2015 時間限制: 1 s   空間限制: 128000 KB   題目等級 : 黃金 Gold 題目描述 Description  阿明是一名推銷員,他奉命到螺絲街推銷他

NOIP2017普及賽後心得

ora 特殊 簡單 text 很多 調試 就是 str 格子 我覺得可能今生再也見不到這麽簡單的題目了……甚至有種能AK的錯覺(不 然而考場上腦殼疼了,只剩下310~330。 T4告訴我以後遇到不會的東西一定要早點學…… 題目分析 T1 分數 這次連模擬都不用了,幹脆叫你輸

[jzoj]2018.07.12NOIP普及模擬賽D:解題報告

1.權勢二進位制 題目: 一個十進位制整數被叫做權勢二進位制,當他的十進位制表示的時候只由0或1組成。例如0,1,101,110011都是權勢二進位制而2,12,900不是。 當給定一個n的時候,計算一下最少要多少個權勢二進位制相加才能得到n。 輸入: k組測試資料。 輸出:

[jzoj]2018.07.15NOIP普及模擬賽D:解題報告

目錄: 1.馬農 2.馬語翻譯 3.馬球比賽  4.棋盤遊戲 1.馬農 題目描述: 在觀看完戰馬檢閱之後,來自大草原的兩兄弟決心成為超級“馬農”,專門飼養戰馬。 兄弟兩回到草原,將可以養馬的區域,分為 N*N 的單位面積的正方形, 並實地進行考察,歸納出了每

Paths on a GridPOJ - 1942 精度合數)

題目: Imagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered ye

NOIP2018普及對稱二叉樹

@對稱二叉樹@ @題目描述@ @題解@ @程式碼@ @[email protected] @題目描述@ 一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹: 二叉樹;

NOIP2018普及擺渡車

@擺渡車@ @題目描述@ @絕對不可能是正解的題解@ @程式碼 - [email protected] @看起來比較像正解的題解@ @程式碼 - [email protected] @[email

NOIP2016普及魔法陣的解析——一些神奇的列舉優化

題目大意:給定一個序列,要求求出滿足,且的a,b,c,d的數量. 首先這道題可以直接用一個桶,先把所有數塞進這個桶裡. 然後我們可以開始列舉答案. 但我們發現,所以我們可以省去以為的列舉,做到列舉,實測在洛谷上能拿到85分. 到這一步優化的程式碼如下: #inc

NOIP2017普及正式賽跳房子

這一題很有它的價值,我都要認真思考一番才能夠想到方法。 先講一下題目大意 題目描述 跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下: 在地面上確定一個起點,然後在起點右側畫 n 個格子,這些格子都在同一條

NOIP2017普及正式賽棋盤

此題依舊簡單,用一個深搜+記憶化就可以AC了! var way:array[1..4,1..2] of longint=((1,0),(0,1),(-1,0),(0,-1)); a,zx:array[0..101,0..101] of longin

NOIP2017普及正式賽 圖書管理員

這一題有很多人都搞不懂意思。但是,只要是認真看了題的人,就不會有什麼錯了! 這一題直接用暴力是可以過的,不需要wjq講的什麼字典樹(不過空閒者可“自殘”一下) var ycl:array[1..8] of longint=(10,100,1000,10000,10000

2018.10.06NOIP普及模擬賽C

T1 YY 題目描述 最近小h接到命令,要再出一份題目,於是小h馬上陷入了沉思之中,想到了yy曾經出過的一道題目:給出一個超大正整數S,S的位數小於500000,然後找出一個數 n, 使得n