P3868 [TJOI2009]猜数字(CRT板子)
生活随笔
收集整理的這篇文章主要介紹了
P3868 [TJOI2009]猜数字(CRT板子)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
現有兩組數字,每組k個,第一組中的數字分別為:a1,a2,...,ak表示,第二組中的數字分別用b1,b2,...,bk表示。其中第二組中的數字是兩兩互素的。求最小的非負整數n,滿足對于任意的i,n - ai能被bi整除。
輸入輸出格式
輸入格式:
?
輸入數據的第一行是一個整數k,(1 ≤ k ≤ 10)。接下來有兩行,第一行是:a1,a2,...,ak,第二行是b1,b2,...,bk
?
輸出格式:
?
輸出所求的整數n。
?
輸入輸出樣例
輸入樣例#1:?復制 3 1 2 3 2 3 5 輸出樣例#1:?復制 23說明
所有數據中,第一組數字的絕對值不超過109(可能為負數),第二組數字均為不超過6000的正整數,且第二組里所有數的乘積不超過1018
每個測試點時限1秒
注意:對于C/C++語言,對64位整型數應聲明為long long,如使用scanf, printf函數(以及fscanf, fprintf等),應采用%lld標識符。
?
?
?
?
?
?
?
?
像第一對a和b??? , 首先其他a的最小公倍數才能滿足其他的式子,求在這個最小公倍數的逆元在成a,有滿足了自己成立,這里就用到了一個小技巧。
這樣滿足了所有的式子成立,在%lcm扔成立
?
?
?
?
1 #include"bits/stdc++.h" 2 using namespace std; 3 typedef long long ll; 4 5 ll k,a[11],b[11],s=1,ans=0; 6 7 8 void exgcd(ll a,ll b,ll &x, ll &y) 9 { 10 if (!b){ 11 x=1,y=0 ;return ; 12 } 13 14 exgcd(b,a%b,x,y); ll t; 15 t=x; 16 x=y; 17 y=t-(a/b)*y; 18 } 19 20 inline ll mul(ll a,ll b) 21 { 22 ll r=0; 23 while (b) 24 { 25 if (b&1)r+=a%=s; 26 b>>=1; 27 a+=a%=s; 28 }return r; 29 } 30 int main() 31 { 32 cin>>k; 33 for (int i=1;i<=k;i++)cin>>a[i]; 34 for (int i=1;i<=k;i++)cin>>b[i],s*=b[i]; 35 for(int i=1;i<=k;i++) 36 { 37 ll x,y; 38 exgcd(s/b[i],b[i],x,y); 39 x=(x%b[i]+b[i])%b[i];(1) 40 // cout<<i<<" "<<x<<endl; 41 ans+=mul(s/b[i]*x,((a[i]%b[i]+b[i])%b[i]));//快速乘,否則爆long long(2)// 一和二式都取模意義下的最小正整數
42 ans%=s; 43 } 44 cout<<ans; 45 }
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/zhangbuang/p/10338369.html
總結
以上是生活随笔為你收集整理的P3868 [TJOI2009]猜数字(CRT板子)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2056 [ZJOI2007]捉迷藏
- 下一篇: python文件引用其他文件中的变量