群赛59

开学以来好久没做群赛啊....基本上做了就会发发自己做的题目,虽然很菜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题是单调队列.又不会。



开始讨厌管机房了,一整个下午泡在那里整这整那的,累死我啊,自己一点事都没做- -|||


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值