C

一个很经典的双指针。我们发现 \(b_i\) 有选择优势,所以考虑从 \(b_i\) 匹配 \(a_j\)。如果可以匹配上,那就皆大欢喜,这两个都跳过;如果匹配不上,也就是 \(b_i<a_j\times 2\),那么也一定有 \(b_i<a_{j+1}\times 2\),所以 \(j\) 不可以往后跑,只能让 \(i\) 往后跑。

如果两个指针有一个跑到头了,贪心就结束了。肯定找不到其他的对能匹配。

代码放在最后。

D

在我写的这篇题解中,对波次的部分详细描述,如果这里过于简略,可以阅读我的洛谷题解。在本 OJ 写的题解侧重于一团黑的部分。

魔丸题。看到 \(10^{100}\) 直接找规律。

发现是一个波次状物,发现 \(\{i,j\}\) 最后的结果只与第一次变黑的波次 \(x\) 有关:

  • 如果 \(x\) 是偶数,那么最后一定是黑。
  • 如果 \(x\) 是奇数,那么最后一定是白。

因为只要一次变黑,后面都是黑白黑白地变。

这里有一个漏洞。

ps: 当我在学校被临时抽上台讲这道题的时候,讲到“这里有一个漏洞”时老师突然打断:
“你不能把你想那么久的东西就简单概括成‘漏洞’,要留给他们自己思考的空间!”
于是开始尬谈:“好大家拿纸笔枚举一下样例二,看看这个算法跟实际结果有什么区别。”

样例二启示我们如果一开始有黑格子被包住了,那么结果不准确。更精确地,除了初始情况,其他情况都不会出现黑格子被包住,因为八连通手没那么长。

那怎么办呢?我们前面说只要进行过操作,都不会有这样被包住的情况,所以只要先做一次操作就可以了。我真聪明。代码就是洛谷题解里的代码,不放了。

E

直接推式子吧。

\[a\times 10^p+b\equiv a+b \pmod M \]

\[a\times (10^p-1)\equiv 0\pmod M \]

\(p\) 是可以枚举的,那么重心来到解同余方程。

懒得多说了,\(a\)\(\lfloor\frac{N}{\gcd(10^d-1,M)}\rfloor\) 种可能。重点是要开 __int128!!!

代码放最后。

C 代码

//#pragma GCC optimize("O3")
//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define is insert
#define fr(i,a,b) for(int i=(a);i<=(b);i++)
#define rf(i,a,b) for(int i=(a);i>=(b);i--)
#define prq priority_queue
#define gYES cout << "YES\n"
#define gNO cout << "NO\n"
#define gYes cout << "Yes\n"
#define gNo cout << "No\n"
const int MOD=998244353;
const int Mod=1e9+7;
const int N=2e6;
using namespace std;
int max(int ax,int ay){ return (ax>ay)?ax:ay; }
int min(int ax,int ay){ return (ax<ay)?ax:ay; }
int abss(int ax){ return max(ax,-ax); }
void fastIO(){ 
	ios::sync_with_stdio(0); 
	cin.tie(0),cout.tie(0); }
int m,n,a[N+5],b[N+5],cnt;
void solve(){
	cin >> n >> m;
	fr(i,1,n) cin >> a[i];
	fr(i,1,m) cin >> b[i];
	sort(a+1,a+n+1); sort(b+1,b+m+1);
	int l=n,r=m;
	while(l>0&&r>0){
		if(b[r]<=a[l]*2){
			r--; l--; cnt++;
		}else r--;
	}cout << cnt;
	return;
}
signed main(){
	fastIO();
	//cin >> t;
	//while(t--){
		solve();
	//}
	return 0;
}

E 代码

//#pragma GCC optimize("O3")
//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
#define int unsigned long long
#define pb push_back
#define is insert
#define fr(i,a,b) for(int i=(a);i<=(b);i++)
#define rf(i,a,b) for(int i=(a);i>=(b);i--)
#define prq priority_queue
#define gYES cout << "YES\n"
#define gNO cout << "NO\n"
#define gYes cout << "Yes\n"
#define gNo cout << "No\n"
const int MOD=998244353;
const int Mod=1e9+7;
const int N=2e6;
using namespace std;
int max(int ax,int ay){ return (ax>ay)?ax:ay; }
int min(int ax,int ay){ return (ax<ay)?ax:ay; }
int abss(int ax){ return max(ax,-ax); }
int p10[20];
void fastIO(){ 
	ios::sync_with_stdio(0); 
	cin.tie(0),cout.tie(0); }
int t,n,m,a[N+5],b[N+5];
void solve(){
	cin >> n >> m;
	int ans=0;
	fr(i,1,19){
		int l=p10[i-1]; 
		int r=min(p10[i],n+1); //n的取值
		int n1=r-l; if(l>=r) break; 
		int g=__gcd(p10[i]-1,m);
		ans+=(n1)%MOD*(n/(m/g)%MOD);
		ans%=MOD;
	}cout << ans;
	cout << endl; return;
}
signed main(){
	fastIO();
	p10[0]=1;
	fr(i,1,19){
		p10[i]=p10[i-1]*10;
	}
	cin >> t;
	while(t--){
		solve();
	}
	return 0;
}
posted on 2026-06-08 20:49  Pure_ManaWing  阅读(3)  评论(0)    收藏  举报