3-11 (three-eleven)

0030

สำหรับโจทย์ข้อนี้ต้องการให้หารเศษจากการหารเลขด้วย 33 และ 1111

30% ของชุดทดสอบ : N<1 000 000 000N<1\ 000\ 000\ 000

เนื่องจากในชุดทดสอบนี้ค่าของ NN อยู่ในช่วงไม่เกิน integer จึงสามารถหาค่าได้โดยการใช้ arithmetic operator ปกติ

Code

#include<bits/stdc++.h>

using namespace std;

int n;

int main() {
	scanf("%d", &n);
	printf("%d %d", n % 3, n % 11);
}

100% ของชุดทดสอบ : N<101 000 000N<10^{1\ 000\ 000}

ในชุดทดสอบนี้เลขดังกล่าวมีค่ามากถึง 101 000 00010^{1\ 000\ 000} หรือ 1 ล้านหลัก

ให้ xx เป็นตัวเลข 1 ล้านหลัก โดย x=a1a2akx = \overline{a_1a_2\dots a_k} และ kk เป็นจำนวนหลักของ xx ซึ่ง xx สามารถเขียนได้อยู่ในรูปของ 10k1a1+10k2a2++100ak=i=1k10kiai10^{k-1}\cdot a_1+10^{k-2}\cdot a_2+\dots+10^0\cdot a_k = \sum\limits_{i=1}^{k} 10^{k-i}\cdot a_i

จากคุณสมบัติที่ว่า (a+b)(a+b) mod\text{mod} m=am=a mod\text{mod} m+bm+b mod\text{mod} mm และ (ab)(a\cdot b) mod\text{mod} m=am=a mod\text{mod} mbm\cdot b mod\text{mod} mm

จึงได้ว่า i=1k10kiai\sum\limits_{i=1}^{k} 10^{k-i}\cdot a_i mod\text{mod} m=i=1k(10kiaim=\sum\limits_{i=1}^{k} (10^{k-i}\cdot a_i mod\text{mod} m)m)

Time Complexity : O(K)O(K) หรือ O(log10N)O(\log_{10}{N})

Code

#include<bits/stdc++.h>

using namespace std;

int a, b;
string s;

int main() {
	cin >> s;
	for (auto &e: s) {
		a = (a * 10) + (e - '0'), a %= 3;
		b = (b * 10) + (e - '0'), b %= 11;
	}
	printf("%d %d", a, b);
}