QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#856002#9622. 有限小数huangceWA 36ms3668kbC++171.3kb2025-01-13 14:45:372025-01-13 14:45:37

Judging History

你现在查看的是最新测评结果

  • [2025-01-13 14:45:37]
  • 评测
  • 测评结果:WA
  • 用时:36ms
  • 内存:3668kb
  • [2025-01-13 14:45:37]
  • 提交

answer

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int ll
using namespace std;
constexpr int N=1e6+7;
constexpr int M=2e3+7;
constexpr int inf=1e9;
int x,y;
void exgcd(int a,int b)
{
	if(!b)
	{
		x=1,y=0;
		return;
	}
	exgcd(b,a%b);
	int t=x;
	x=y;
	y=t-a/b*y;
}
int exgcd1(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int x1,y1,d;
	d=exgcd1(b,a%b,x1,y1);
	x=y1;
	y=x1-(a/b)*y1;
	return d;
}
int p5[37],p2[37];
void init()
{
	p2[0]=p5[0]=1;
	for(int i=1;i<=32;i++)
	{
		p2[i]=p2[i-1]*2;
	}
	for(int i=1;i<=17;i++)
	{
		p5[i]=p5[i-1]*5;
	}
}
void solve()
{
	int a,b;
	cin>>a>>b;
	int p=b;
	while(p%5==0) p/=5;
	while(p%2==0) p/=2;
	if(p==1) return cout<<"0 1"<<endl,void();
	exgcd(b/p,p);
	x=(x%p+p)%p; // x 为 b/p 的逆元
	int c=inf,d;
	for(int i=0;i<=30;i++)
	{
		for(int j=0;j<=13;j++)
		{
			int cur_d=p2[i]*p5[j];  // d/p
			if(cur_d>inf) break;
			int tmp=((-((a*cur_d*x)%p))%p+p)%p;
			int cur_x,cur_y;
			exgcd1(1,p,cur_x,cur_y);
			cur_x=((cur_x*tmp)%p+p)%p; // c
			if(cur_x<c)
			{
				c=cur_x;
				d=cur_d*p;
			}
		}
	}
	cout<<c<<' '<<d<<endl;
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	init();
	int T=1; cin>>T;
	while(T--){solve();}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3668kb

input:

4
1 2
2 3
3 7
19 79

output:

0 1
1 3
1 4375
3 316

result:

ok 4 case(s)

Test #2:

score: -100
Wrong Answer
time: 36ms
memory: 3612kb

input:

10000
11 12
28 53
17 60
2 35
17 181
80 123
68 141
79 163
71 99
13 64
33 61
15 32
16 61
11 86
33 74
128 143
40 53
7 23
30 31
5 6
86 181
73 91
13 23
71 81
1 2
7 38
117 160
33 83
129 151
88 153
25 58
16 19
19 141
95 124
43 96
71 139
11 59
106 109
93 152
34 43
17 99
1 57
20 159
16 25
5 73
159 170
172 17...

output:

1 3
1 828125000
1 15
1 7
1 231680000
23 60058593750
1 2203125000
3 2086400000
1 63360
0 1
1 61000
0 1
1 59570312500
1 10750
1 18500
1 1117187500
1 331250
1 11230468750
1 31
1 15
1 289600000
1 455000
1 17968750000
1 1265625
0 1
1 1484375
0 1
1 415
1 235937500
1 765000000
1 181250
1 2968750
1 4406250
...

result:

wrong answer Integer 60058593750 violates the range [1, 10^9]