LightOJ1214 Large Division 基础数论+同余定理
Given 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 |
Output for Sample Input |
6 101 101 0 67 -101 101 7678123668327637674887634 101 11010000000000000000 256 -202202202202000202202202 -101 |
Case 1: divisible Case 2: divisible Case 3: divisible Case 4: not divisible Case 5: divisible Case 6: divisible |
题意:给出两个数a, b,问能否被b整除。
题解:基础数论。简单的同余定理应用,将a作为字串储存,相当于每x位(和b同位)模b一次,得到余数时相当于将这个区间改写成这个余数,移动区间继续运算。最终余数为零时代表可以被整除,非零则否。
补充:其实可以想成这样,三位数就是百进制,四位数就是千进制的同余定理。
1 #include <stdio.h>
2 #include <string.h>
3 #include <algorithm>
4 #include <iostream>
5 #include <math.h>
6 #define ll long long
7 using namespace std;
8
9 char a[300];
10 int main()
11 {
12 int T, x, s;
13 ll t, b;
14 scanf("%d", &T);
15 for(int i=1; i<=T; i++)
16 {
17 scanf("%s %lld", a, &b);
18 x=strlen(a);
19 if(a[0]=='-')//注意负数变正
20 {
21 s=2;
22 t=a[1]-'0';
23 }
24 else
25 {
26 s=1;
27 t=a[0]-'0';
28 }
29 t=t%abs(b);
30 for(int j=s; j<x; j++)
31 {
32 t=(t*10+a[j]-'0')%abs(b); //同余定理的应用
33 }
34
35
36 if(t==0)
37 {
38 printf("Case %d: divisible\n", i);
39 }
40 else
41 printf("Case %d: not divisible\n", i);
42
43 }
44
45 }