Large Division-----同余模定理(大数的求余)
同余模定理
讲解转自博客:
https://blog.csdn.net/qq_40873884/article/details/80312889
定义
所谓的同余,顾名思义,就是许多的数被一个数 d 去除,有相同的余数。d 数学上的称谓为模。如 a = 6, b = 1, d = 5, 则我们说 a 和 b 是模 d 同余的。因为他们都有相同的余数 1 。
数学上的记法为:
a≡ b(mod d)
可以看出当 n < d 的时候,所有的 n 都对 d 同商,比如时钟上的小时数,都小于 12,所以小时数都是模 12 的同余.对于同余有三种说法都是等价的,分别为:
(1) a 和 b 是模 d 同余的.
(2) 存在某个整数 n ,使得 a = b + nd .
(3) d 整除 a - b .
可以通过换算得出上面三个说话都是正确而且是等价的.
定律
同余公式也有许多我们常见的定律,比如相等律,结合律,交换律,传递律….如下面的表示:
1) a≡a(mod d)
2) a≡b(mod d)→b≡a(mod d)
3) (a≡b(mod d),b≡c(mod d))→a≡c(mod d)
如果a≡x(mod d),b≡m(mod d),则
4) a+b≡x+m (mod d)
5) a-b≡x-m(mod d)
6) a*b≡x*m(mod d )
应用
(a+b)%c=(a%c+b%c)%c;
(a*b)%c=(a%c*b%c)%c;
对于大数的求余,联想到进制转换时的方法,得到
举例如下,设大数 m=1234, 模 n
就等于
((((1 * 10) % n + 2 % n) % n * 10 % n + 3 % n) % n * 10 % n + 4 % n) % n
大数求余的简单模板:
#include<cstdio>
char num[10000];
int main()
{int n,i;while(scanf("%s%d",num,&n)!=EOF){int ans=0;for(i=0;num[i]!='\0';i++)ans=((ans*10)%n+(num[i]-'0')%n)%n;printf("%d\n",ans);}return 0;
}
例题
iven two integers, a and b, you should check whether a is divisible by b or not. We know that an integer a is divisible by an integer b if and only if there exists an integer c such that a = b * c.
Input
Input starts with an integer T (≤ 525), denoting the number of test cases.
Each case starts with a line containing two integers a (-10200 ≤ a ≤ 10200) and b (|b| > 0, b fits into a 32 bit signed integer). Numbers will not contain leading zeroes.
Output
For each case, print the case number first. Then print 'divisible' if a is divisible by b. Otherwise print 'not divisible'.
Sample Input
6
101 101
0 67
-101 101
7678123668327637674887634 101
11010000000000000000 256
-202202202202000202202202 -101
Sample Output
Case 1: divisible
Case 2: divisible
Case 3: divisible
Case 4: not divisible
Case 5: divisible
Case 6: divisible
题意:A能否被B整除
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{long long k=1,n;scanf("%lld",&n);while(n--){char s[1010];long long sum=0,m;scanf("%s",s);scanf("%lld",&m);int l=strlen(s);for(int i=0;i<l;i++){if(s[i]=='-'){continue;}sum=(sum*10+(s[i]-'0'))%m;}if(sum==0)printf("Case %lld: divisible\n",k++);elseprintf("Case %lld: not divisible\n",k++);}return 0;}
Large Division-----同余模定理(大数的求余)相关推荐
- 大大大大数怎么求余?C语言
问题: 一个特别大的数除以23求余数用C语言应该怎么算啊?比如23232323232323232323232323232323232323232323232323232323233除以23,怎么算余数 ...
- c语言中int下小数求余大数,Sicily1020-大数求余算法及优化
Github最终优化代码: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 题目如下: 1020. ...
- 大数问题(循环求余/快速幂求余/快速幂问题)
大数问题 1.大数求余问题 解题思路 1.1循环求余O(n)O(n)O(n) 1.2.快速幂求余O(logn)O(\log n)O(logn) 2.快速幂问题 解题思路 1.大数求余问题 在仅使用i ...
- 【笔试/面试】—— 从大数相减到大数求除(大数求余)
进行大数相除的一个简单思路是:从被除数中减去除数,每减去一次,就将结果加1,直到被除数小于除数为止,此时的被除数即为大数求余的余数.从被除数中减去除数使用的是大数减法,结果+1使用的是大数加法. 大数 ...
- C++实现大数运算(加减乘除求余)
前言: 只有部分GCC编译器支持int128,而我们平常使用的软件,最大只有_int64.当这些不够用时,我们该怎么办? 我本身想写代码实现整数型大数据的加减乘除和求余,结果写着写着想着连小数运算的也 ...
- c语言怎么对大数求余,c语言取余数(c语言怎么求两数的余数)
C语言提供了一个取余数的运算符%,称之为"模"运算符.只有两个整数之间才可以进行模运算!a % b 表示 用b来整除a,商整数,得到余数.如:5%3 = 2 4%3 =13%3 . ...
- 年年有余之java求余的技巧集合
背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...
- java 整数变负数_年年有余之java求余的小技巧
背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...
- HDU 3123 GCC(同余模定理)
GCC 大意:给一个n,一个m,求(0! + 1! + 2! + 3! + 4! + ... + n!)%m 0 <= n < 10^100 0 < m &l ...
最新文章
- python基础之文件操作,集合,函数
- MySQL 5.6 my.cnf 参数说明(转)
- linux 运行 dmol3,Dmol3建模及优化
- (王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)
- [UE4]响应鼠标点击
- 东北真有“油炸冰溜子”这道菜吗?
- 开始VC6学习之旅3
- JVM之内存分配与回收策略
- JavaWeb—优化JDBC代码
- 火狐浏览器 附件组件 Xpath 使用
- linux系统修改时区的方法
- 【STM32H7的DSP教程】第14章 DSP统计函数-最大值,最小值,平均值和功率
- sql-update 用法
- qq语音聊天对方听不到我说话怎么办?
- 启程Objectvie-C(绿柠檬学习笔记)
- 利用zabbix监控网宿cdn的流量
- 教你怎样用CAD做三维图
- Frame profiling
- 迅睿cms,迅睿cms程序系统,迅睿cms网站优化
- 【GA三维路径规划】遗传算法无人机三维路径规划【含Matlab源码 1268期】