如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】

Big Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5930    Accepted Submission(s): 4146

Problem Description

As we know, Big Number is always troublesome. But it‘s really important in our ACM. And today, your task is to write a program to calculate A mod B.

To make the problem easier, I promise that B will be smaller than 100000.

Is it too hard? No, I work it out in 10 minutes, and my program contains less than 25 lines.

Input

The input contains several test cases. Each test case consists of two positive integers A and B. The length of A will not exceed 1000, and B will be smaller than 100000. Process to the end of file.

Output

For each test case, you have to ouput the result of A mod B.

Sample Input

2 3

12 7

152455856554521 3250

Sample Output

2

5

1521

此题需要用到同余定理:

常用的同余定理有以下三种:

(1)((A mod m)*(B mod m))mod m ==(A*B)mod m

(2)((A mod m)+(B mod m))mod m ==(A+B)mod m

(3)((A mod m)-(B mod m)+ m)mod m ==(A-B)mod m

在减法中,由于a mod n 可能小于b mod n,需要在结果上加上n.

我们先了解下如何运用同余定理求余数:

/*例如10000对m求余:
* 10000%m
* ==(10%m*1000%m)%m
* ==(10%m*(10%m*100%m)%m)%m
* ==(10%m*(10%m*(10%m*10%m)%m)%m)%m
* 用代码表示就是:
* 假设10000是字符串长度是len
*/

/*
* 如123对m求余
* 123%m
* ==((12%m*10%m)%m+3%m)%m
* ==(((10%m+2%m)%m*10%m)%m+3%m)%m
* ==((((1%m*10%m)%m+2%m)%m*10%m)%m+3%m)%m
*/
gets(str);
int ans=0;
for(i=0;i<len;i++)
{
	ans=ans*10+str[i];
	ans=ans%m;
}

详细的模运算请参考:http://blog.csdn.net/chocolate_22/article/details/6458029

此题用到了(1)(2)两个:

#include<stdio.h>
#include<string.h>
#define MAX 1100
int main()
{
	int n,m,j,i,s,t;
	char p[MAX];
	while(scanf("%s",p)!=EOF)
	{
		scanf("%d",&n);
		int l=strlen(p);
		s=0;
		for(i=0;i<l;i++)
		{
			s=s*10+p[i]-‘0‘;
			s=s%n;
		}
		printf("%d\n",s);
	}
	return 0;
}
时间: 2024-10-06 01:10:17

如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】的相关文章

2016湖南省赛----A 2016 (同余定理)

2016湖南省赛----A 2016 (同余定理) Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 组数据. 每组数据包含两个整数 n,m (1≤n,m≤10 9). Output 对于每组数据,输出一个整数表示满足条件的数量. Sample Input 32 63 2016 2016 1000000000 1000000000 Sample

[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11978   Accepted: 3194 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

POJ Multiple (BFS,同余定理)

http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6164   Accepted: 1339 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM

ACM选修HUST1058(市赛题) Lucky Sequence 同余定理

Description Edward  得到了一个长度为  N  的整数序列,他想找出这里面有多少个“幸运的”连续子序列.一个连续子序列被称为“幸运的”,当且仅当该子序列内的整数之和恰好是  K  的整数倍数.他请求你写一个程序来计算他喜欢的连续子序列个数. Input 输入第一行是一个整数  T,表示有  T  组数据.每组数据第一行是两个整数  N (1 <= N <= 10^6), K (1 <= K <= 10^9).接下来的一行包含  N  个整数  Ai (|Ai| &

hdu1212 Big Number &amp;第六届山东省赛Single Round Math (同余定理,大数取模)

题目链接:Big Number 题目大意:每次输入两个数,第一个是高精度,第二个数小于100000:求 a mod b 根据同余定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%c 所以 对于大数,例如 :123 可以这样分解 123 =  (1*10+2)*10 + 3: 123 % c =   (  (  (  1%c *  10%c)%c + 2%c) %c  * 10%c) + 3 %c  ) %c; 因此,我们用字符串处理这个数,通过

数论 --- 同余定理

声明:以下文章是借鉴了别人的再加上自己补充后的,转载请注明! 一.同余 对于整数除以某个正整数的问题,如果只关心余数的情况,就产生同余的概念. 定义1 用给定的正整数m分别除整数a.b,如果所得的余数相等,则称a.b对模m同余,记作a≡b(mod m),如 56≡0 (mod 8). 举个例子: 3%2=1 5%2=1 则有: (5-3)%=0 [同余性质] 1) 自反性 2) 传递性 3) 对称性 4) 若 a ≡ b (mod m), c ≡ d (mod m) 则 a+b ≡ b+ d(m

同余定理的定义及其性质

一.同余定理的定义: 两个整数a,b,如果他们同时对一个自然数m求余所得的余数相同,则称a,b对于模m同余.记作a≡b(mod m).读为:a同余于b模m.在这里“≡”是同余符号. 二.同余定理的一些性质: 对于同一个除数,两个数之和(或差)与它们的余数之和(或差)同余.(加减乘同理) (a+b)%c==(a%c+b%c)%c 对于同一个除数,如果有两个整数同余,那么它们的差一定能被这个除数整除. 对于同一个除数,如果两个数同余,那么他们的乘方仍然同余. 记忆口诀: 1.“数的和差积与余的和差积

POJ--1465--Multiple【BFS+同余定理】

链接:http://poj.org/problem?id=1465 题意:给一个数字n,和m个数字,找一个由这些数字组成的最小的n的倍数,如果不存在输出0. 思路:这题怎么想都想不到bfs上去,看了别人的解题报告,其实是用bfs来枚举,但是加了一个牛逼的剪枝:同余.即如果A%X==B%X,则(A*10+K)%X==(B*10+K)%X. 我们枚举m中每一个数字做这个K,实际上是枚举了一个数,B*10是之前枚举的数字,如果这个数%X得到的值之前已经得到过,则没必要再往下计算,因为根据同余定理剩下的

POJ 2635 The Embarrassed Cryptographer(大数求余)

题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 = 1:      1×10 + 4 % 11 = 3:      3×10 + 3 % 11 = 0;我们可以把大数拆成小数去计算,同余膜定理保证了这个算法的这正确性,而且我们将进制进行一定的扩大也是正确的. 注意:素数打标需要优化,否则超时.   进制需要适当,100和1000都可以,10进制超