P10246 题解
注意事项
如果你 TLE 并且 分,请开 __int128!
思路
因为 很大,所以我们肯定不能枚举日期,我们应该枚举 ,其中 可以设为 。然后要枚举月份和日期的分割点就行。
代码
# 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;
}

浙公网安备 33010602011771号