开学以来好久没做群赛啊....基本上做了就会发发自己做的题目,虽然很菜t t
1个水题 最后一题
1个模拟题 后来才发现,囧
1个数论,这次又通过这题数论学到好多。
K - Hit and Blow 迷迷糊糊写了几个比较,然后就过了t_t
H - Peer Review 模拟题 有problem 满足3个条件:1.被一个人审批多次,2.被同组织审批,3.被审批次数不等于k
#include<stdio.h>
#include<string.h>
#define LMT 1005
int blo[LMT],time[LMT],sear[LMT][LMT],no[LMT];
char ins[LMT][13];
int all,n,k;
int search(char *name)
{
int i;
for(i=0;i<all;i++)
if(strcmp(name,ins[i])==0)
return i;
strcpy(ins[i],name);
all++;
return i;
}
int test(int x)
{
int j=0;
for(j=1;j<=sear[x][0];j++)
if(blo[sear[x][j]]==blo[x])
return 0;
if(time[x]!=k)return 0;
return 1;
}
int main()
{
int i,j,ans;
char name[13];
while(scanf("%d%d",&k,&n)!=EOF)
{
if(k==0&&n==0)break;
memset(time,0,sizeof(time));
memset(sear,0,sizeof(sear));
memset(no,0,sizeof(no));
ans=all=0;
for(i=1;i<=n;i++)
{
int x;
scanf("%s",name);
blo[i]=search(name);
for(j=0;j<k;j++)
{
scanf("%d",&x);
time[x]++;
int t;
for( t=1;t<=sear[x][0];t++)
if(sear[x][t]==i&&0==no[x])
{
ans++;
time[x]=-1;
no[x]=1;
}
if(t>sear[x][0])
sear[x][++sear[x][0]]=i;
}
}
for(i=1;i<=n;i++)
if(0==test(i)&&0==no[i]) ans++;
if(0==ans)printf("NO PROBLEMS FOUND\n");
else printf("%d PROBLEMS FOUND\n",ans);
}
return 0;
}
J - Remoteland 用不大于n的数组成(相乘)一个尽可能大的完全平方数,开始迷惑为什么样例中的数开方后有小数,后来一想这是mod之后的,好吧
根据完全平方数的性质:所有素因子的个数必须是偶数,我们要可以利用所有积除以奇数个个数的积就是我们要的结果因为要取摸,所以不能直接除a=c/b
然后根据这个公式:
c%mod=(a%mod)*(b%mod);令A=a%mod; B=b%mod;C=c%mod;
则A=a%mod=(a*1)%mod=a%mod*1%mod=(a%mod)*(b^(mod-1))%mod --------因为(b^(mod-1))%mod=1,费马小定理。
=(a*b)%mod*(b^(mod-2))%mod=(c%mod)*(b%mod)^(mod-2)%mod=C*B^(mod-2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
#define N 10000000
#define mod 1000000007
bool flag[N+5];
int cnt,prime[N/10];
LL num[N+5];
void Prime()//取素数
{
memset(flag,false,sizeof(flag));
cnt=0;
for(int i=2;i<=N;i++)
{
if(flag[i])continue;
for(int j=2*i;j<=N;j+=i)flag[j]=true;
prime[cnt++]=i;
}
}
int getsum(int n,int p) //这里可以到得n!里面有多少个素数因子p
{
int ans=0;
while(n)
{
ans+=n/p;
n/=p;
}
return ans;
}
int pow(LL x,int n) //快速幂相乘
{
LL ans=1;
while(n)
{
if(n&1)ans=ans*x%mod;
x=x*x%mod;
n>>=1;
}
return ans;
}
int main()
{
//freopen("a.txt","r",stdin);
num[0]=1;
for(int i=1;i<=N;i++)num[i]=num[i-1]*i%mod; //求阶乘
Prime();
int n;
while(scanf("%d",&n)&&n)
{
LL ret=1;
for(int i=0;i<cnt&&prime[i]<=n;i++)
{
int x=getsum(n,prime[i]);
if(x&1)ret=ret*prime[i]%mod; //求出奇数个素数的乘积
}
int ans=num[n]*pow(ret,mod-2)%mod; //这里用到了费马小定理,既x^(mod-1))%mod=1
printf("%d\n",ans);
}
return 0;
}
C题也写了下,直接二分果断超时了。
G题是单调队列.又不会。
开始讨厌管机房了,一整个下午泡在那里整这整那的,累死我啊,自己一点事都没做- -|||