一眼上去这不中国剩余定理板题,但一直WA最后一个点,经过漫长的调试后,原来爆long long了
于是第一次开了__int128_t,__int128_t不能正常输入输出,只能快读快输
[TJOI2009] 猜数字
题目描述
现有两组数字,每组
第一组中的数字分别用
其中第二组中的数字是两两互素的。求最小的
输入格式
第一行一个整数
第二行
第三行
输出格式
输出一行一个整数,为所求的答案
样例 #1
样例输入 #1
3
1 2 3
2 3 5
样例输出 #1
23
提示
对于
每个测试点时限
注意:对于 C/C++
语言,对 long long
。
若使用 scanf
,printf
函数(以及
fscanf
,fprintf
等),应采用 %lld
标识符。
解
第一次代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int N=12;
int a[N],b[N];
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,y,x);
-=a/b*x;
yreturn d;
}
int inv_inverse(int a,int m)
{
int x,y;
(a,m,x,y);
exgcdreturn (x%m+m)%m;
}
signed main() {
::sync_with_stdio(false);cin.tie(nullptr);
iosint n;
>>n;
cinfor(int i=1;i<=n;i++)
>>a[i];
cinint M=1;
for(int i=1;i<=n;i++)
{
>>b[i];
cin*=b[i];
M}
for(int i=1;i<=n;i++)
[i]=(a[i]%b[i]+b[i])%b[i];
aif(n==1)
{
<<a[1]%b[1]<<'\n';
coutreturn 0;
}
int ans=0;
for(int i=1;i<=n;i++)
{
int Mi=M/b[i];
=(ans+a[i]*Mi%M*inv_inverse(Mi,b[i]))%M;
ans}
<<ans<<'\n';
coutreturn 0;
}
会WA最后一个点
开了__int128_t后:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int __int128_t
const int N=12;
int a[N],b[N];
inline void read(int& a)
{
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-')
= -1;
w = getchar();
ch }
while (ch >= '0' && ch <= '9')
{
= s * 10 + ch - '0';
s = getchar();
ch }
= s * w;
a }
void write(int x)
{
if(x<0)
('-'),x=-x;
putcharif(x>9)
(x/10);
write(x%10+'0');
putcharreturn;
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,y,x);
-=a/b*x;
yreturn d;
}
int inv_inverse(int a,int m)
{
int x,y;
(a,m,x,y);
exgcdreturn (x%m+m)%m;
}
signed main() {
::sync_with_stdio(false);cin.tie(nullptr);
iosint n;
(n);
readfor(int i=1;i<=n;i++)
(a[i]);
read// cin>>a[i];
int M=1;
for(int i=1;i<=n;i++)
{
(b[i]);
read// cin>>b[i];
*=b[i];
M}
for(int i=1;i<=n;i++)
[i]=(a[i]%b[i]+b[i])%b[i];
aint ans=0;
for(int i=1;i<=n;i++)
{
int Mi=M/b[i];
=(ans+a[i]*Mi%M*inv_inverse(Mi,b[i]))%M;
ans}
(ans);
write// cout<<ans<<'\n';
return 0;
}