这道题分为Easy Version和Hard Version。 Hard Version和这道题的区别只在于模数不同。
给你长度为n的数字串s(下标从1开始),有q次询问,每次询问给你l和r,问你[l, r][l,r]区间构成的数字对9取模之后的结果是多少。(不保证没有前导零)
Input
第一行输入n,q,表示数字串的长度和询问次数。
第二行,输入数字串ss。
接下来q行,每行两个数字l,r表示询问区间。
Output
共q行,每行一个数字表示答案。
Sample 1
Inputcopy | Outputcopy |
---|---|
6 2 102345 1 2 2 4 | 1 5 |
Note
第一次询问,取数字串10,对9取模后得1。
第二次询问,取数字串023,对9取模后得5。
一开始的解法使用到了stack和快速幂,样例只能过14个,之后会超时;
#include<bits/stdc++.h>
using namespace std;
string s;
stack<long long>st;
long long f(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {//此处等价于if(power%2==1)
result = result * base%9;
}
power >>= 1;//此处等价于power=power/2
base = base * base%9;
}
return result%9;
}
int main() {
long long n, q;
cin >> n >> q;
cin >> s;
for (long long i = 0;i < q;i++) {
long long l, r;
cin >> l >> r;
for (long long i = l-1;i < r;i++) {
st.push(s[i] - '0');
}
long long len = st.size();
long long sum = 0;
for (long long i = 0;i < len;i++) {
sum += st.top() * f(10, i);
st.pop();
sum=sum % 9;
}
cout << sum%9 << endl;
}
return 0;
}
寻找规律:任何一个整数模9同余于它的各数位上数字之和
AC代码
#include <iostream>
#include <string>
#include<vector>
using namespace std;
string s;
vector<int>arr;
int main() {
int n, q;
int ans = 0;
cin >> n >> q;
cin >> s;
//前缀和初始化
arr.push_back(0);
for (int i = 1;i <= n;i++) {
arr.push_back(arr[i - 1] + s[i - 1] -'0');
}
while (q--) {
ans = 0;
int l, r;
cin >> l >> r;
if (l == 1)
ans = arr[r] % 9;
else if (l != 1)
ans = (arr[r] - arr[l - 1]) % 9;
cout << ans << endl;
}
}