2022杭电暑期第一场个人题解

1011 random

        按照我的理解可以认为生成n/2个0和n/2个1,然后进行m次操作,然后m/2个操作删掉0,m/2个操作删掉1,对剩下的1求和就是n/2-m/2,然后按照要求对结果取模。

       但是取模一开始wa了,后来才知道是答案除法取模要用乘法逆元。

       也就是说((n-m)/2) mod p会wa掉。

       简单地说就是在一个数除另一个数得出来的结果直接取模不行,应该要改成乘上mod p的乘法逆元,给个链接【洛谷日报#205】乘法逆元 - 知乎。

        然后一般可以用exgcd(扩展欧几里得求逆元)但是这里直接手算就行。

        ax\equiv 1 mod p    这里解出x就是a的逆元,2对p取余的逆元很简单,因为在1到p-1直接,就是ax-1=kp   令k=1然后求出x=(p+1)/2  ,然后验算一遍没什么问题就可以了。

#include 
using namespace std;
#define ll long long
void solve() {
	int n,m;
	cin>>n>>m;
	ll p = 1000000007;
	ll ans=((n-m)*(p+1)/2)%p;
	cout<>t;
	while(t--) {
		solve();
	} 
	return 0;
} 

乘法逆元的相关知识比较复杂,暂时还没弄懂,弄明白了会补上,直接套模板就可以算逆元,但是是单个的逆元,多个逆元暂时不会算。附exgcd的模板:

#include 
using namespace std;
#define ll long long
ll x,y;
void exgcd(ll a,ll b) {
	if(b==0 ) {
		x=1;
		y=0;
		return ;
	}
	exgcd(b,a%b);
	ll temp=x;
	x=y;
	y=temp-a/b*y;
} 
int main() {
	ll a,b;
	cin>>a>>b;
	exgcd(a,b);
	x=(x%b+b);
	cout<

留下一个不会写的题目下次填上:

逆元2 - 题目 - Daimayuan Online Judge

1012 Alice and Bob

a[0]>=1的话Alice取胜,然后显然两个1的情况下,Alice是必胜的,然后推到4个2的情况下Alice必胜,同理,8个3,16个4,也就是说2^i<=a[i]的时候alice是必胜的。

但是交上去wa了。。。。

应该是还有的地方没有考虑到:

然后列举发现有一种情况2 2 2 3 3这种情况下alice是必胜的,因为alice分成2 2 和2 3 3 然后bob只能擦去2 2 然后出现1 2 2然后再分成1和2 2 这种情况下bob擦去1然后出现两个1,此时alice必胜。

也就是说这种情况下的3对于2是会有贡献的,比如说有x个3,那么分成a和b两组,此时a+b=x,然后a组擦掉,留下b组,全部减一,剩下b个2,因为alice取最优策略,然后为了让bob尽量擦去的更少,x分成两个x/2,和x-x/2组。此时对于2来说,是有着x/2的贡献。

也就是可以理解为z个i+1对于i的贡献是z/2。

所以从后往前遍历累加一下a[i]+=a[i+1]/2就可以了。

#include 
using namespace std;
#define ll long long
#define endl '\n'

int a[1000005];
void solve() {
	int n;
	cin>>n;
	bool ok=false; 
	for(int i=0;i<=n;i++) cin>>a[i];
	for(int i=n;i>=1;i--) a[i-1]+=a[i]/2;
	if(a[0]>=1) ok=1; 
	if(ok) cout<<"Alice"<>t;
	while(t--) {
		solve();
	}
	return 0; 
} 

其他题还在补...

你可能感兴趣的:(杭电2022暑期训练,c++,算法)