문제에 Codeforces 라운드 589 (사업부. 2) 솔루션

그게 페티시즘의 일종인가?
아니, 객관적으로 신이다.

주제의 지식과 정확히 어떻게 Mcdic 하나님.

(여전히 머리를 불고 있었지만)

가상 열려 필드 플레이.

제 AB의 개구 초. C는 실제로 거의, 약간의 수치를하지 않았다.

열기 D. 수행 방법 ...... 사업부. D이 나에 갇혀, 그리고 정신 붕괴 될 수있다.

E.로 전송 이것은 SB 문제 WOC 아니다 ......

위로 간 D.에 후 입 밖으로 생각하지만, 정신은 밖으로 재생 만 오래, 오래과 함께 붕괴되었다.

마지막으로, 만 20 분은 F.을 열 때 이 ...... 매운 닭 배로? 아무리.


에이

폭력은 시뮬레이션 할 수 있습니다.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=100010;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int l,r,cnt[10];
bool check(int x){
    while(x) cnt[x%10]++,x/=10;
    bool ans=true;
    FOR(i,0,9) if(cnt[i]>=2) ans=false;
    FOR(i,0,9) cnt[i]=0;
    return ans;
}
int main(){
    l=read();r=read();
    FOR(i,l,r) if(check(i)) return printf("%d\n",i),0;
    puts("-1");
}

디스커버리 \ (I는 \) 가장 좌측 행 \ (\ 분 (A_I + 1 , m) \) 무엇을 기입 판정 된 열은 \ (I는 \) 탑정 \ (\ 분 (b_i + 1 , N) \) 라인은 이미 채우기 위해 어떤 결정된다. 남아있는.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=1111,mod=1000000007;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,m,ans=1,mat[maxn][maxn];
int main(){
    n=read();m=read();
    FOR(i,1,n) FOR(j,1,m) mat[i][j]=-1;
    FOR(i,1,n){
        int x=read();
        FOR(j,1,x){
            if(mat[i][j]==0) return puts("0"),0;
            mat[i][j]=1;
        }
        if(x!=m){
            if(mat[i][x+1]==1) return puts("0"),0;
            mat[i][x+1]=0;
        }
    }
    FOR(j,1,m){
        int x=read();
        FOR(i,1,x){
            if(mat[i][j]==0) return puts("0"),0;
            mat[i][j]=1;
        }
        if(x!=n){
            if(mat[x+1][j]==1) return puts("0"),0;
            mat[x+1][j]=0;
        }
    }
//  FOR(i,1,n){
//      FOR(j,1,m) printf("%d ",mat[i][j]);
//      puts("");
//  }
    FOR(i,1,n) FOR(j,1,m) if(mat[i][j]==-1) ans=2ll*ans%mod;
    printf("%d\n",ans);
}

각 품질 요소의 기여, 수행을 고려하십시오.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=100010,mod=1000000007;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int x,num[maxn],len,ans=1;
ll n;
int calc(int x){
    int ans=0;
    ll pr=x;
    while(true){
        ans=(ans+n/pr)%(mod-1);
        ll pre=pr;
        pr*=x;
        if(pr/pre!=x || pr>n) break;
    }
    return ans;
}
int qpow(int a,int b){
    int ans=1;
    for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) ans=1ll*ans*a%mod;
    return ans;
}
int main(){
    x=read();n=read();
    for(int i=2;i*i<=x;i++) if(x%i==0){
        num[++len]=i;
        while(x%i==0) x/=i;
    }
    if(x>1) num[++len]=x;
    FOR(i,1,len){
        int x=num[i];
        ans=1ll*ans*qpow(x,calc(x))%mod;
    }
    printf("%d\n",ans);
}

정직하고, 매우 요정합니다.

그림 없음, 명확한 솔루션입니다.

지점으로부터 세트 포인트에 임의로 설정 1, 2 점, 3 점을 각각 설정 확실히 스물 두 측부가 연결되어있다.

다만 도면에서 세 개의 원 고리를 찾고자, 3 점 세트 포인트 1 이상이어야 포인트 2, 3 순서에 관계없이 점 세트의 세트. 더 세 개의 원 링, 해결책이없는 경우.

각 지점의 경우의 나머지 \ (U \) , 경우 \ (U \) 이 점은 초점이 지점에서 확실히있는 것을 나타내는, 심지어 이러한 세 가지 측면 중 하나가 아닙니다. 이 세 점과 에지 점을 복수 접속되어 있지 않은 경우, 용액.

마지막으로 파를 확인합니다.

시간 복잡도 \ (O (N) \)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=600060;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,m,el,head[maxn],to[maxn],nxt[maxn],u_fa[maxn],dep[maxn],fa[maxn],ans[maxn],q[maxn],h,r,cnt=0;
bool flag,nnn[4],vis[maxn],use[maxn];
inline void add(int u,int v){
    to[++el]=v;nxt[el]=head[u];head[u]=el;
}
int getfa(int x){
    return x==u_fa[x]?x:u_fa[x]=getfa(u_fa[x]);
}
void dfs(int u,int f){
    dep[u]=dep[f]+1;fa[u]=f;
    for(int i=head[u];i;i=nxt[i]){
        int v=to[i];
        if(v==f) continue;
        if(dep[v]){
            if(fa[fa[u]]==v && !flag){
                ans[u]=1;ans[fa[u]]=2;ans[fa[fa[u]]]=3;
                flag=true;
            }
        }
        else dfs(v,u);
    }
}
void dfs2(int u,int f,int x,int y){
    vis[u]=true;
    for(int i=head[u];i;i=nxt[i]){
        int v=to[i];
        if(v==f || (ans[v]!=x && ans[v]!=y)) continue;
        if(!use[(i+1)/2]) cnt++,use[(i+1)/2]=true;
        if(!vis[v]) dfs2(v,u,x,y);
    }
}
bool check(int x,int y){
    MEM(vis,0);
    int cnt1=0,cnt2=0;
    FOR(i,1,n){
        if(ans[i]==x) cnt1++;
        if(ans[i]==y) cnt2++;
    }
    cnt=0;
    FOR(i,1,n) if(ans[i]==x){dfs2(i,0,x,y);break;}
    return 1ll*cnt1*cnt2==cnt;
}
int main(){
    n=read();m=read();
    FOR(i,1,n) u_fa[i]=i;
    FOR(i,1,m){
        int u=read(),v=read();
        add(u,v);add(v,u);
        u=getfa(u);v=getfa(v);
        u_fa[u]=v;
    }
    FOR(i,1,n) if(getfa(i)!=getfa(1)) return puts("-1"),0;
    dfs(1,0);
    if(!flag) return puts("-1"),0;
    FOR(u,1,n){
        if(ans[u]) continue;
        nnn[1]=nnn[2]=nnn[3]=false;
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(ans[v]) nnn[ans[v]]=true;
        }
        FOR(i,1,3) if(!nnn[i]){
            if(ans[u]) return puts("-1"),0;
            ans[u]=i;
        }
        if(!ans[u]) return puts("-1"),0;
    }
    if(!check(1,2) || !check(1,3) || !check(2,3)) return puts("-1"),0;
    FOR(i,1,n) printf("%d ",ans[i]);
}

이자형

간단한 이항 반전.

특별 제 문장 \ (K = 1 \) . 가정 이하 \ (K \ GE 2 \) .

설정 \ (F_ {I, J} \) 정확히 \ (I \) 요구 사항, 단지에 맞지 않는 라인 \ (J \) 번호 계획이 컬럼의 요구 사항을 충족하지합니다. 요구 사항은 \ (F_ {0,0} \) .

설정 \ (G_ {I, J} \) 선택한 모든 옵션에 대한 \ (나는 \) 라인 요구 사항을 충족하지 않는, \ (J \) 열 수와 요구 사항을 충족하지 않는 프로그램. 이것은 명백하다 \ (G_ {I, J} = \하기 Binom {N} {I} \하기 Binom {N} {J} (K-1) ^ {N ^ 2 (NI) (NJ)} K ^ {( NI) (NJ)} \) .

정의상 \ (G_ {I, J} = \ SUM \ limits_ {X = I} ^ N- \ SUM \의 limits_ {Y = J} ^ N- \하기 Binom {X} {I} \하기 Binom {Y} {J} {X F_, Y} \) .

이항 반전 \ (F_ {I, J =} \ SUM \ limits_ {X} = ^ I는 N- \ SUM \의 limits_ {} J = Y ^ N- \하기 Binom I {X} {} \ {Y}하기 Binom J} {(-. 1) ^ {(XI) + (YJ)} G_ {X, Y} \) .

시간 복잡도 \ (O (N-2 ^ \ K 로그) \) . 그것은 더 최적화 될 수있다.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=100010,mod=1000000007;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,k,ans,fac[maxn],invfac[maxn];
int qpow(int a,ll b){
    int ans=1;
    for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) ans=1ll*ans*a%mod;
    return ans;
}
int C(int n,int m){
    return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
int main(){
    n=read();k=read();
    if(k==1) return puts("1"),0;
    fac[0]=1;
    FOR(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
    invfac[n]=qpow(fac[n],mod-2);
    ROF(i,n-1,0) invfac[i]=1ll*invfac[i+1]*(i+1)%mod;
    FOR(i,0,n) FOR(j,0,n){
        int sum=1ll*C(n,i)*C(n,j)%mod*qpow(k-1,1ll*n*n-1ll*(n-i)*(n-j))%mod*qpow(k,1ll*(n-i)*(n-j))%mod;
//      printf("i=%d,j=%d,sum=%d\n",i,j,sum);
        if((i+j)%2==0) ans=(ans+sum)%mod;
        else ans=(ans-sum+mod)%mod;
    }
    printf("%d\n",ans);
}

에프

길에.

추천

출처www.cnblogs.com/1000Suns/p/11614517.html