A.Gregor and Cryptography
题意:
给你一个质数p,让你找到两个大于等于2且小于p的数a和b,满足p%a==p%b
思路:
1.大于2的质数都是奇数,所以对于任意质数,p%2==1永恒成立
2.还有什么是永真的呢?显然p%(p-1)==1
代码:
#include<bits/stdc++.h>
using namespace std;
void sol(){
int n;
cin>>n;
cout<<2<<' '<<n-1<<'\n';
return;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
sol();
}
}
B. Gregor and the Pawn Game
题意:
与国际象棋的规则类似,如果小兵的前方没有敌人,则可以往上走一格,如果小兵的左上角或者右上角有敌人,则可以吃掉它。现在有一个n*n的棋盘,棋盘的第一行有若干个敌人,棋盘的最后一行有若干个小兵,现在假设你能不停操作你的小兵前进,请问有多少个小兵可以到达第一行?
思路:
1.由规则可以得出假如某个小兵面前有个敌人,而且它的左上角和右上角都没有敌人,那它就动不了了,所以无法到达第一行。
2.对于每个小兵,它有三种方法可以到达第一行,要么是吃掉左上角的敌人,要么是直接走到第一行,要么是吃掉右上角的敌人。所以直接模拟即可(注意判断是否越界)
代码:
#include <bits/stdc++.h>
using namespace std;
void sol(){
int n;
cin>>n;
string a,b;
cin>>a>>b;
for(int i=0;i<n;i++){
if(b[i]=='0')continue;
if(i!=0&&a[i-1]=='1'){ //吃掉左上角的敌人
a[i-1]='2';
continue;
}
if(a[i]=='0'){ //直接走上去
a[i]='2';
continue;
}
if(i!=n-1&&a[i+1]=='1'){//吃掉右上角的敌人
a[i+1]='2';
continue;
}
}
int res=0;
for(int i=0;i<n;i++){
if(a[i]=='2')++res;
}
cout<<res<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)sol();
}
C.Web of Lies
题意:
给定一个无向图,每个点都有它自身的力量值,有q次询问,每次询问有三种操作
1.加边
2.删边
3.特殊询问
这个特殊询问的规则就是,对于图里面的每一个点来说,假如它有与其他点相连(也就是有“朋友")并且它的力量值比它的所有"朋友"都要小,那它就被称为“弱鸡”,然后图中的所有“弱鸡”同时自杀。假如自杀后又有一些点变成了”弱鸡“,那就继续自杀,直到这个图没有任何”弱鸡“。题目就是要你求还有多少个点是存活的。
WARNING!
这个特殊询问只是模拟罢了,也就是说不影响后面的
做法:
其实没有必要把这种图完全描述出来,只需要知道对于每一个点,力量值比它大的朋友有多少个就行了,用一个一维数组就可以搞定。
例如a[x]==0,说明点x没有朋友或者没有朋友的力量值比它大,那它就可以存活
加边操作:输入两个数x y,假如x比较小,那就a[x]+=1,否则a[y]+=1
删边操作:输入两个数x y,假如x比较小,那就a[x]-=1, 否则a[y]-=1
特殊询问:不需要每次询问都统计一遍,实时统计就行
操作:
初始化res为n
假如加边过程中使得某个原本a[x]==0的点变成了a[x]==1,那就res-=1
假如删边过程中使得某个点x满足a[x]==0,那就res+=1
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int a[N];
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
int res=n;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
if(x>y)swap(x,y);
if(a[x]++==0){
--res;
}
}
int q;
cin>>q;
while(q--){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
if(x>y)swap(x,y);
if(a[x]++==0){
--res;
}
}
else if(op==2){
int x,y;
cin>>x>>y;
if(x>y)swap(x,y);
if(--a[x]==0)++res;
}
else{
cout<<res<<'\n';
}
}
}