https://codeforces.com/contest/1543/problem/A
不算签到了。
给你两个数a,b,你可以把a,b同时加或者减1,请问经过多少次操作可以得到他们的最大公因数。
要求输出这个最大公因数和操作次数
与n最接近的大于k的倍数:n+k-n%k;
与n最接近的小于k的倍数:n-n%k;
根据__gcd(a,b)=__gcd(a-b,b),而且他们的最大公因数等于他们自身,所以只需要求出a-b,取
min((n+k-n%k),(n-n%k))即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int t,n,m;
void solve()
{
cin>>n>>m;
if(n<m)swap(n,m);
if(n==m)
{
cout<<0<<endl;
return;
}
int tmp=abs(n-m);
cout<<min((tmp-n%tmp),(n%tmp))<<endl;
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}
https://codeforces.com/contest/1543/problem/B
设不方便数为
给你一个数列,你可以做任意次操作,令这个数列在综合不变的情况下不方便数最小(也就是说整数可以拆)
简单,求和取平均数,然后输出(n-sum/n)*(sum/n)即可
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=2e5+5;
ll t,n,num[maxn],sum,avg,cnt;
void solve()
{
sum=0;
cin>>n;
rep(i,1,n)
{
cin>>num[i];
sum+=num[i];
}
avg=sum/n;
cnt=(sum-avg*n);
cout<<(n-cnt)*cnt<<endl;
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}
https://codeforces.com/contest/1543/problem/C
读题读到我直接裂开。。
给出三个概率 c,m,p,和一个数v,如果抽到c,m则其减少v,均分到其余两个概率中,若其中一个概率为0,则均分到p中,如果抽到p,游戏结束。问轮次的期望。
dfs即可
注意浮点误差,不能等于0,要小于1e-6(题目给定的数)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
const double inf=1e-6;
int t; double c,m,p,v,minn;
double dfs(double c,double m,double p,int pos,double sum)
{
double res=0;
res += p*pos*sum;
//printf("%lf %lf %lf %d %lf %lf\n",c,m,p,pos,p*sum,p*pos*sum);
if(c<inf&&m<inf)return res;
if(c>inf)
{
minn=min(c,v);
if(m>inf)
{
res+=dfs(c-minn,m+minn/2,p+minn/2,pos+1,sum*c);
}
else res+=dfs(c-minn,0,p+minn,pos+1,sum*c);
}
if(m>inf)
{
minn=min(m,v);
if(c>inf)
{
res+=dfs(c+minn/2,m-minn,p+minn/2,pos+1,sum*m);
}
else res+=dfs(0,m-minn,p+minn,pos+1,sum*m);
}
//cout<<res<<endl;
//cout<<res<<endl;
return res;
}
void solve()
{
cin>>c>>m>>p>>v;
printf("%.12lf\n",dfs(c,m,p,1,1));
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}
https://codeforces.com/contest/1543/problem/D1
交互题,
有一个密码,范围为0到n,如果输入正确输出1,错误输出0;
当输入错误时,密码改变为 这个密码 异或 你输入的数,最多输入n次。
请你根据输出,猜测密码。
由于异或运算 异或两个相同的数会变回原来的数,而且异或运算有交换律。
则若密码为n,我输入 (i^(i-1))即可使得上一次输出错误被异或(i-1)的密码恢复原密码。故只需要n次就可以猜出来。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
const double inf=1e-6;
int t; double c,m,p,v,minn;
double dfs(double c,double m,double p,int pos,double sum)
{
double res=0;
res += p*pos*sum;
//printf("%lf %lf %lf %d %lf %lf\n",c,m,p,pos,p*sum,p*pos*sum);
if(c<inf&&m<inf)return res;
if(c>inf)
{
minn=min(c,v);
if(m>inf)
{
res+=dfs(c-minn,m+minn/2,p+minn/2,pos+1,sum*c);
}
else res+=dfs(c-minn,0,p+minn,pos+1,sum*c);
}
if(m>inf)
{
minn=min(m,v);
if(c>inf)
{
res+=dfs(c+minn/2,m-minn,p+minn/2,pos+1,sum*m);
}
else res+=dfs(0,m-minn,p+minn,pos+1,sum*m);
}
//cout<<res<<endl;
//cout<<res<<endl;
return res;
}
void solve()
{
cin>>c>>m>>p>>v;
printf("%.12lf\n",dfs(c,m,p,1,1));
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}