HDOJ 1576 A/B(数论整除)
来源:互联网 发布:网络用语哔哔什么意思 编辑:程序博客网 时间:2024/05/16 15:45
题目:A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4259 Accepted Submission(s): 3283
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)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
21000 5387 123456789
Sample Output
79226060
Author
xhd
Source
HDU 2007-1 Programming Contest
思路:
这道题的题意说的很清楚,就是一个关于整除的问题。
一开始的想法当然是对语言表达式进行数学表达式的转换。由n=A%9973,那么A=n+m*9973,而B又和9973互质,且要求的是(A/B)%9973的值,那么就可以变形为((n+m*9973)/B)%9973。
一开始的想法是遍历m求解,当第一个满足的时候结束遍历,但是这种做法的时间消耗太大,比如题目里给的第一个样例,m要遍历到10的6次方数量级才会结束,肯定会超时。
后来就想换一种思路,倒推回去。一个数模9973,所得数一定在0-9972之间,如果遍历结果的话会大大缩短遍历的时间。
所以不妨设结果为i,则表达式变为,((n+m*9973)/B)%9973=i,再变形得,((n+m*9973)/B)=i+9973*j,最后再移项得,n-B*i=B*j*9973-m*9973。所以若是i解的话一定满足n-B*i能被9973整除。由于n,B都是已知量,所以不妨让i从1到9973开始遍历,得到第一个符合的i值即为所求。
代码:
#include<iostream>#include<stdio.h>#include<cmath>using namespace std;int main(){ int T; cin>>T; for(int i=0;i<T;i++) { long long B,n; cin>>n>>B; for(int i=1;i<=9972;i++) { long long x; x=B*i-n; if(x%9973==0) { cout<<i<<endl; break; } } }}
0 0
- HDOJ 1576 A/B(数论整除)
- HDOJ 2075 A|B? 整除问题
- HDOJ 1576 A/B
- hdoj 1576 A/B
- HDOJ 1576 A/B
- hdoj-1576-A/B
- HDU 1576 A/B(数论)
- [数论]HDOJ 2503 a/b + c/d 欧几里得算法
- 2075 A|B?(A整除B)
- HDU 1576 A/B 数论水题
- [HDU](1576) A/B ----扩展欧几里德(数论)
- A + B Problem + 数论
- A/B(数论)
- HDOJ 2096 小明A+B(数论水题,同余定理)
- HDOJ 题目1576 A/B(枚举)
- HDOJ A/B 1576【扩展欧几里得+求逆元】
- HDOJ 1576 A/B (扩展欧几里得)
- HDOJ 1576 A/B(拓展欧几里得)
- 组合数学 - 放苹果问题
- mac mysql初始密码的重置
- 如何正确学习并提高学习效率?
- 15.1 类的委托
- 剑指offer——数值的整数次方
- HDOJ 1576 A/B(数论整除)
- c 到 unix c 高级编程中计算文件大小的三种方法
- URAL 1180 Stone Game 博弈 找规律 大数取模 除3取模
- Python中protobuf
- Java枚举类型(一)
- 第十六章 Lambda与Java8
- Spring4笔记----为什么要使用AOP
- 在centOS上安装Ubuntu字体
- 16.1 Lambda