สำหรับโจทย์ข้อนี้ต้องการให้หารเศษจากการหารเลขด้วย 3 และ 11
30% ของชุดทดสอบ : N<1 000 000 000
เนื่องจากในชุดทดสอบนี้ค่าของ N อยู่ในช่วงไม่เกิน 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 000
ในชุดทดสอบนี้เลขดังกล่าวมีค่ามากถึง 101 000 000 หรือ 1 ล้านหลัก
ให้ x เป็นตัวเลข 1 ล้านหลัก โดย x=a1a2…ak และ k เป็นจำนวนหลักของ x ซึ่ง x
สามารถเขียนได้อยู่ในรูปของ 10k−1⋅a1+10k−2⋅a2+⋯+100⋅ak=i=1∑k10k−i⋅ai
จากคุณสมบัติที่ว่า (a+b) mod m=a mod m+b mod m และ (a⋅b) mod m=a mod m⋅b mod m
จึงได้ว่า i=1∑k10k−i⋅ai mod m=i=1∑k(10k−i⋅ai mod m)
Time Complexity : O(K) หรือ O(log10N)
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);
}