一场优秀的涨rating比赛。。
1.GTW likes math
问题描述
某一天,GTW听了数学特级教师金龙鱼的课之后,开始做数学《从自主招生到竞赛》。然而书里的题目太多了,GTW还有很多事情要忙(比如把妹),于是他把那些题目交给了你。每一道题目会给你一个函数f(x)=ax^2+bx+c求这个函数在整数区间[l,r]之间的最值。
题解
注意到这个数据范围[l,r]最长只有200,因此可以直接暴力枚举整个整点区间。找出最小值和最大值。
当时因为吃晚饭,稍微晚点才赶来做比赛,所以交的比较晚,不过还是1A了233。
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,c,l,r,cas,tmp,maxf,minf;
int getf(int x)
{
return a*x*x+b*x+c;
}
int main()
{
scanf("%d",&cas);
while(cas--)
{
maxf=-999999999;
minf=999999999;
scanf("%d%d%d%d%d",&a,&b,&c,&l,&r);
for(int i=l;i<=r;++i)
{
maxf=max(maxf,getf(i));
minf=min(minf,getf(i));
}
printf("%d %d\n",maxf,minf);
}
}
2.GTW likes gt
问题描述
从前,有n只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第i只GT会随机得到一个能力值b_i。在第i秒的时候,第i只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功m次,第i次发功的时间为c_i,则在第c_i秒结束后,b_1,b_2,…,b_{c_i}都会增加1。
现在,GTW想知道在第n秒之后,会有几只GT存活下来。
一秒内可以发功多次。
ci并不是有序的。
想了十几分钟,一开始看错题,没想出来= =
这次比赛的败笔。。
不过当时我足够灵活,跑去做第三题。
3.GTW likes function
题意:
求phi(fn(x))的值。
题解:
好歹我也是思考推导过带权组合数求和化简的题的人。。
看到这个题第一反应可以化简f。
因此直接打表找规律。
原以为会很麻烦。
结果原来f0(x)=x+1…
因此fn(x)=x+n+1…
所以就变成了求phi(x+n+1)的水题了。。
这个题也太水了。。
然后我为了防hack果断写了个pollard_rho优化
结果跑得竟然比暴力慢。。。
数据辣鸡啊。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int S=20;
int cnt;
ll n,x,phi,fac[70];
ll mul(ll n,ll m,ll p)
{
ll ans=0;
while(m)
{
if(m%2)ans=(ans+n)%p;
n=2*n%p;
m/=2;
}
return ans;
}
ll pow(ll n,ll m,ll p)
{
ll ans=1%p;
while(m)
{
if(m%2)ans=mul(ans,n,p);
n=mul(n,n,p);
m/=2;
}
return ans;
}
bool miller_rabin(ll n)
{
if(n==2)return true;
if(n<2||n%2==0)return false;
ll a,x,u=n-1,t=0,y;
while(u%2==0)t++,u/=2;
for(int i=0;i<S;++i)
{
a=rand()%(n-1)+1;
x=pow(a,u,n);
for(int j=0;j<t;++j)
{
y=mul(x,x,n);
if(y==1&&x!=1&&x!=n-1)return false;
x=y;
}
if(x!=1)return false;
}
return true;
}
ll gcd(ll n,ll m)
{
return m==0?n:gcd(m,n%m);
}
ll pollard_rho(ll n,ll c)
{
ll i=1,k=2,x=rand()%n,y=x;
while(1)
{
i++;
x=(mul(x,x,n)+c)%n;
ll temp=y-x;
if(temp<0)temp=temp*-1;
ll d=gcd(temp,n);
if(d!=1&&d!=x)return d;
if(y==x)return n;
if(i==k){y=x;k<<=1;}
}
}
void work(ll n)
{
if(miller_rabin(n)){fac[cnt++]=n;return;}
ll p=n;
while(p>=n)p=pollard_rho(p,rand()%(n-1)+1);
work(p);
work(n/p);
}
int main()
{
while(~scanf("%I64d%I64d",&n,&x))
{
cnt=0;
memset(fac,0,sizeof fac);
work(n+x+1);
if(cnt==1)
{
printf("%I64d\n",n+x);
continue;
}
sort(fac,fac+cnt);
int len=unique(fac,fac+cnt)-fac;
phi=n+x+1;
for(int i=0;i<len;++i)
phi=phi/fac[i]*(fac[i]-1);
printf("%I64d\n",phi);
}
}
4.GTW likes czf
问题描述
从前,有两个人名叫GTW,DSY。一天,他们为了争夺DSY的妹子CZF,决定进行一次决斗。首先,CZF会给出一个区间l,l+1,l+2……rl,l+1,l+2……r,和两个数G,T。现在,CZF会在G,T两个数中随机一个数X,在区间l,r中随机一个数Y,进行一种特殊的运算@。CZF想要快速知道有多少数字可能会是答案。
然而GTW并不会做这道题,但是为了赢得CZF,他就来寻求你的帮助。
由于答案可能会很大,所以把最终的答案模1000000007。
我们规定运算X @ Y =((X and Y) or Y) xor X.
当时看出来x@y=x xor y
然后不会做了。
看完题解什么数位DP,似乎很有道理,这题不亏。
最后因为瞎作死,一次 unsuccessful hack 扣了我50分,排到16名,本来该是15的= =(反正涨的rating也一样233)
争取下次div2完了能进div1= =