A.张老师和菜哭武的游戏
题意:给n,a,b,一开始集合里有两个数a和b ,然后两个人轮流往里加数,
加的数符合num=xa+xb;最后集合里的数为一个等差数列,公差为最小间距gcd(a,b)
gcd(a,b)=c; a=k1c b=k2c;
num=(k1x+k2y)c,所以num能被gcd(a,b)整除
一些关于gcd的知识:
(1)gcd(xa-1,xb-1)=xgcd(a,b)-1;
(2) gcd(Fib(a) , Fib(b)) = Fib(gcd(a,b)) Fib(x)为斐波那契数列的第X项
Fib(a+b)=Fib(a-1)Fib(b) +Fib(a)Fib(b+1);
#include<iostream> #include<algorithm> #include<iomanip> #include<cmath> #include<string> using namespace std; int gcd(int a, int b){ if(b==0){ return a; }else{ return gcd(b,a%b); } } int main(){ int t; cin>>t; while(t--){ int n,a,b; cin>>n>>a>>b; int c=gcd(a,b); int total; total=n/c; if(total&1){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } } return 0; }View Code
B.伤害计算
题意:包含d的加n*(x+1)/2;不包含d的直接加一下就可以
#include<iostream> #include<cstdio> #include<algorithm> #include<iomanip> #include<cmath> #include<string> using namespace std; typedef long long ll; int main(){ int i,j; string s; cin>>s; double sum=0,a=0,b=0; int len=s.length(); for(i=0;i<len;i++){ if(s[i]>='0'&&s[i]<='9'){ while(s[i]>='0'&&s[i]<='9'){ a=a*10+s[i]-'0'; i++; } if(s[i]=='d'){ i++; while(s[i]>='0'&&s[i]<='9'){ b=b*10+s[i]-'0'; i++; } sum+=a*(b+1)/2.0; a=0,b=0; }else{ sum+=a; a=0; } } } if(sum>(int)sum){ printf("%.1f",sum); }else{ printf("%.0f",sum); } return 0; }View Code
F.排列计算
题意:输入n,m,有1到n个数字,构造一个序列,使m次查询后的值最大
查询最多的数字的位置的数最大
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int a[200010]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int l,r; cin>>l>>r; a[l]++; a[r+1]--; } for(int i=1;i<=n;i++){ a[i]=a[i-1]+a[i]; } sort(a+1,a+n+1); ll sum=0; for(int i=1;i<=n;i++){ sum+=i*a[i]; } cout<<sum<<endl; return 0; }View Code