P10246 题解

注意事项

如果你 TLE 并且 6868 分,请开 __int128!

思路

因为 ai\sum a_i 很大,所以我们肯定不能枚举日期,我们应该枚举 ki=1,2,3,,logkk^{i=1,2,3,\dots,\log_k\infin},其中 \infin 可以设为 maxai=3×1014\max\sum a_i=3\times10^{14}。然后要枚举月份和日期的分割点就行。

代码

# include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
typedef pair <int, int> pii;
const ll inf = 3e14 + 5;
int t, n,a[300005],  k;
bool flag;
ll month, day;
vector <pii> v;
bool cmp (const pii& a, const pii& b) {
	return a.first != b.first ? a.first < b.first : a.second < b.second;
}
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> n >> k;
		for (int i = 1; i <= n; ++ i)
			cin >> a[i];
		if (k < 2) {
			cout << "0\n";
			continue ;
		}
		v.clear ();
		for (ll i = k; i <= inf; i *= k)
			for (ll j = 10; j <= i; j *= 10) {
				month = i / j, day = i % j;
				if (day != i % (j / 10) && month <= n && day && day <= a[month])
					v.push_back ({month, day});
			}
		sort (v.begin (), v.end (), cmp);
		cout << v.size () << '\n';
		for (pii i : v)
			cout << i.first << ' ' << i.second << '\n';
	}
	return 0;
}
posted @ 2024-03-10 20:22  Vitamin_B  阅读(13)  评论(0)    收藏  举报  来源