前缀和
这个题目巨妙,打的时候没写出来,后面补题发现太牛了
思路:当前区间左端点 L L L ,当我们向右移动一次,就相当于,原式 - f ( L ) + f ( L + 1 e 18 ) f(L) + f(L + 1e18) f(L)+f(L+1e18),值就等于原式 + 1;所以左端点移动一次就是 + 1,同时再把1e18 的值算出来,构造 1 999……8,2 999……7等,可以得出,等于81 * 1e18。
#include<iostream>
#include<string.h>
#include<cstring>
#include<unordered_map>
#include<iomanip>
#include<vector>
#include<algorithm>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#define int long long #define fi first
#define se second
#define pb push_back
#define bpt __builtin_popcountllusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;const int N = 2e5 + 10, mod = 998244353;
const int INF = 0x3f3f3f3f;ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }vector<int> g[N];void solve() {int n = 1e18;int a; cin >> a;int ans = a - n % a * 81 % a;cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;t = 1;//cin >> t;while (t--) solve();return 0;
}