有理數取餘這是乙個知識點,也可能配合別的演算法出,而讓你根據有理數取餘的知識輸出結果(我猜的~)
言歸正傳
首先看題目的讀入,乍一看好像很簡單,cin就行啊。但是看看資料你會發現, 0≤a≤10^ 10001, 0≤ b ≤10^ 10001,這數可不是一般的大啊。因此,我們就要上點新知識了!
快讀函式,對於本題來說,並沒有什麼型別能存下數a數b,所以只能用快讀。(也可能有我不知道……)
快讀函式:
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}
講解一下,
1.inline 內聯函式,可以理解為巨集定義,比如define ll long long,在編譯預處理的時候,編譯器會把**裡的ll都換成long long。同理,inline和define一樣的效果,只不過inline後面是函式,inline int power (){},在編譯預處理的時候,**中有power函式的地方全部被替換成整個函式,對應引數傳入。值得注意的是,因為發生的是巨集替換,所以在迴圈中呼叫內聯函式的時候,會出現**過長的情況,因為每一次迴圈呼叫都會把整個函式的**展開於你的**中,即呼叫幾次,你的**裡就出現了多少次整個內聯函式**,這會嚴重消耗你的記憶體(準確的說,或許是程式**區?),所以迴圈中盡量不要使用內聯函式。
開始分析快讀函式**了,
2.先看返回值吧。返回的是xf,x表示讀入的絕對值,f是符號,xf就是讀入的數,返回的也就是讀入的數了。
快讀函式的讀入,都是讀入的字元,因為字元讀入比數字讀入用時少,所以把大數的每一位當成字元讀入。
兩個while迴圈,第乙個while迴圈的目的是濾去數字前多餘的空格等符號,如果符號為負號,那麼我就標記一下f=-1,用於最後的return;第二個while迴圈讀入數字字元,上面**中的兩種形式都可以,表達的含義也是相同的。(x<<3)+(x<<1)的含義是x222+x2=x*10,與注釋**對應。ch^48實現的就是ch-'0』的操作,與注釋**對應。後面的比較好理解,十進位制數乘個10,加上個個位的數,前者是後者的二進位制實現,所以前者的速度會比後者快點。
3.當第二個迴圈結束的時候,就是再一次讀取到非數字字元的時候,此時代表數字讀入結束。
4.注意每個迴圈中都要進行讀取字元操作,這樣才能迴圈起來。
對應到本題來,還是會有問題啊,那return還是沒法return這麼大的數啊。其實,我們可以在我所留的空白位置加一句x=x%mod;就能實現數的縮小,還不會影響最終要求的結果。具體為什麼不會影響,這與取餘的運算規則有關,我實在不想細寫一遍了,可以看 d題裡講解的知識點(挺重要的)
對於本題,比較特殊,我們要討論一下無解的情況:(這個題比較全面的包括了分數取餘的不同情況)
1.b是mod的倍數:若a也是mod的倍數,那麼就存在b*x%mod=a%mod,兩邊恆等於0,所以x可以是任意整數(無窮解);若a不是mod的倍數,那麼等式左邊恆等於0,等式右邊恆不等於0,所以不存在x使得左右相等。
2.b不是mod的倍數:因為mod是質數,所以mod與b互質,這就滿足了費馬小定理的前提,所以根據費馬小定理變形得必存在x使上述式子成立,即有解。
因此,當且僅當b不是mod的倍數時有解。
所以,如果b是mod的倍數,直接輸出angry!就行了。當b不是mod的倍數的時候,再進行計算即可。
還有新知識快速冪,不過到此為止,這個題和上面鏈結裡的d題已經是很類似了,所以我就不多講了,知識點都可以很詳細的在上述鏈結裡看到。(如果你是從那個鏈結裡來的,那你就被我套娃了,hhh)
#include
#define ll long long
using
namespace std;
const
int mod=
19260817
;inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}ll ksm
(ll x,ll t)
return ans;
}int
main()
cout
%mod<}
P2613 模板 有理數取餘
數論一道題也不會,下午考試怎麼辦啊!p2613 模板 有理數取餘 然後就改一下下快讀,直接暴力搞.但是只得了10分,woc include include include include include include include include define ll long long int ...
有理數均值
本題要求編寫程式,計算n個有理數的平均值。輸入第一行給出正整數n 100 第二行中按照a1 b1 a2 b2 的格式給出n個分數形式的有理數,其中分子和分母全是整形範圍內的整數 如果是負數,則負號一定出現在最前面。在一行中按照a b的格式輸出n個有理數的平均值。注意必須是該有理數的最簡分數形式,若分...
有理數比較大小及有理數相加
本題要求編寫程式,比較兩個有理數的大小,並且計算兩個有理數的和。輸入格式 在一行中按照a1 b1 a2 b2的格式給出兩個分數形式的有理數,其中分子和分母全是整形範圍內的正整數。輸出格式 在一行中按照a1 b1 a2 b2的格式輸出兩個有理數比較大小 在一行中按照a b的格式輸出兩個有理數的和。注意...