A Permutation
官方题解分析的很清楚了,数*2构成环,数*3连向其它的环,所以我们就是能乘2就乘2,不能乘2就乘3。
#include
#include
#include
#include
using namespace std;
const int maxn=1e6+5;
int T,p;
bool vis[maxn];
int ans[maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&p);
for(int i=1;i<p;++i)
vis[i]=0;
ans[1]=1;
vis[1]=1;
int tmp=1;
bool flag=0;
for(int i=2;i<p;++i)
{
if(!vis[(tmp*2)%p])
{
ans[i]=(tmp*2)%p;
vis[(tmp*2)%p]=1;
tmp=(tmp*2)%p;
}
else
if(!vis[(tmp*3)%p])
{
ans[i]=(tmp*3)%p;
vis[(tmp*3)%p]=1;
tmp=(tmp*3)%p;
}
else
{
flag=1;
break;
}
}
if(flag)
puts("-1");
else
{
for(int i=1;i<p;++i)
printf("%d ",ans[i]);
puts("");
}
}
return 0;
}
E Game
取前缀和/len(前缀和长度)的最大值。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int T,n;
ll a,sum,ma;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum=ma=0;
for(int i=1;i<=n;++i)
{
scanf("%lld",&a);
sum+=a;
ma=max(ma,sum/i+(sum%i>0));
}
printf("%lld\n",ma);
}
return 0;
}
I Tournament
构造题,我们要让每一个队伍都待差不多的时间,假如一共有10个队伍,1 最先开始,那么其要在中间部分结束,10要在中间部分开始,那么中间开始就是(1,10)。中间部分,6-9期望9是最晚来的所以,最后应该是 (1,9)。然后向前依次是 (1,8),(2,8)…。1-5中期望1是最早结束的,所以应该先是(1,10),然后向后依次是 (2,9),(2,10)…。我们再看开始的部分,我们期望5最晚来,所以最后是(1,5),(2,5),(3,5),(4,5)。然后向前依次是(1,4),(2,4),(3,4)…。再看最后的部分,我们期望6是最早走的,那么开始是(6,7),(6,8),(6,9),(6,10)。然后向后依次是,(7,8),(7,9),(7,10)…。
#include
#include
using namespace std;
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=2;i<=n/2;++i)
for(int j=1;j<i;++j)
printf("%d %d\n",j,i);
for(int i=n/2+1;i<n;++i)
for(int j=1;j<n-i+1;++j)
printf("%d %d\n",j,i);
for(int i=1;i<=n/2;++i)
for(int j=n-i+1;j<=n;++j)
printf("%d %d\n",i,j);
for(int i=n/2+1;i<n;++i)
for(int j=i+1;j<=n;++j)
printf("%d %d\n",i,j);
}
return 0;
}