開學以來好久沒做群賽啊....基本上做了就會發發自己做的題目,雖然很菜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 1005int 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 1000000007bool 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題是單調隊列.又不會。
開始討厭管機房了,一整個下午泡在那裡整這整那的,累死我啊,自己一點事都沒做- -|||