hdu 1576

n=A%9973即n=A-A/9973*9973,设A=B*x,B*x-9973*y=n。。exgcd解之。。。

数论题,心好累。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<queue>
 5 #include<algorithm>
 6 #define inc(i,l,r) for(i=l;i<=r;i++)
 7 #define dec(i,l,r) for(i=l;i>=r;i--)
 8 #define mem(a) memset(a,0,sizeof(a))
 9 #define inf 1e9
10 #define ll long long
11 #define succ(x) (1<<x)
12 using namespace std;
13 int read(){
14     int x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
16     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
17     return x*f;
18 }
19 ll T,a,b,n,x,y;
20 void gcd(ll a,ll b,ll &x,ll &y){
21     if(b==0){
22         x=1;y=0;
23     }else{
24         gcd(b,a%b,y,x);
25         y-=(a/b)*x;
26     }
27 }
28 int main(){
29     T=read();b=9973;
30     while(T--){
31         n=read();a=read();
32         gcd(a,b,x,y);
33         x*=n;
34         printf("%d\n",(x%b+b)%b);
35     }
36     return 0;
37 }

时间: 2024-10-13 12:21:35

hdu 1576的相关文章

HDU 1576 A/B 扩展欧几里德算法

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2017    Accepted Submission(s): 1469 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个

HDU 1576 A/B (扩展欧几里得应用)

题目链接:HDU 1576 A/B 中文题, 思路:设X=(A/B)%9973.A/B=k_1*9973+X.A=B*k_1*9973+x*B.n=A%9973,A=k_2*9973+n.k_2*9973+n=B*k_1*9973+x*B B*X ≡ n mod 9973 就是转化为 求B关于n模9973 的逆元.gcd(B,9973) = 1 得知一定有解. AC代码: #include<stdio.h> #define ll __int64 ll exgcd(ll a,ll b,ll &a

HDU 1576 A/B(拓展欧几里得)

Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T,表示有T组数据. 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). Output 对应每组数据输出(A/B)%9973. Sample Input 2 1000 53 87 123456789 Sample Output 7922 60

HDU 1576 A/B(扩展欧几里德变形)

一道扩展欧几里德的变形题目 题中给出 n = A%9973 → n = A - A/9973*9973(若x = A%B 则 x = A - A/B*B) 因为A能整除B 所以设x = A/B → A = B*x 所以原式 = B*x - A/9973*9973 = n 设y = A/9973 B*x - 9973y = n 然后利用扩展欧几里德求出x即可. #include <iostream> #include <cstdio> #include <algorithm&g

HDU 1576 -- A/B (总结乘法逆元的几种求法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7264    Accepted Submission(s): 5774 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

HDU - 1576 A/B(扩展欧几里得算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 普通版欧几里得算法(辗转相除): 1 typedef long long LL; 2 LL gcd(LL a,LL b){ 3 return (b==0) ? a : gcd(b,a%b); 4 } 扩展欧几里得算法(理论):对于不完全为0的非负整数,

HDU 1576 (乘法逆元)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思路: 两种思路,一种从乘法逆元角度,另一种从扩展GCD推公式角度. ①乘法逆元: 先来看下逆元和乘法逆元的关系,对于A*X=B,有X=A-1*B,A-1就是普通的逆元了,在这里就是倒数. 如果A*X=B mod n,变成同余式了,那么A-1依然是存在的,只不过不是倒数了,一般把同余之后的逆元称为乘法

HDU 1576 A/B(扩展欧几里德变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T,表示有T组数据. 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). Output 对应每组数据输出(A/B)%9973. Sampl

hdu 1576 A/B (扩展欧几里德简单运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3351 Accepted Submission(s): 2545 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必

HDU 1576 A/B(欧几里德算法延伸)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目: Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T,表示有T组数据.每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). Output 对应每组数据输出(A/B)%9973. S