Loading

代码-几道群论

洛谷P4980 【模板】Pólya 定理

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data

//Math
const int mod=1e9+7;
int& fmod(int &x){return x+=x>>31&mod;}
int mypow(int a,int x,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}
int myphi(int n){
    int res=n;
    for(int d=2;d*d<=n;d++)if(n%d==0)
        for(res=res-res/d;n%d==0;n/=d);
    if(n>1) res=res-res/n;
    return res; 
}

//Main
void Main(){
    int n,ns=0; cin>>n;
    vector<int> div;
    for(int d=1;d*d<=n;d++)if(n%d==0)
        div.pb(d),d*d==n?void():div.pb(n/d);
    for(int d:div) fmod(ns+=1ll*
        mypow(n,d-1)*myphi(n/d)%mod-mod);
    cout<<ns<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t; for(cin>>t;t--;Main());
    return 0;
}

UVA10601 Cubes

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=12,M=6;

//Math
ll fac[N+1];
void math_init(int i=-1){
    for(fac[0]=1,i=0;i<N;i++)
        fac[i+1]=fac[i]*(i+1);
}

//Group
int cnt[M];
ll mycalc(int k,int n){
    ll res=fac[n/k];
    R(i,M){
        if(cnt[i]%k) return 0;
        res/=fac[cnt[i]/k];
    }
    return res;
}

//Main
void Main(){
    R(i,M) cnt[i]=0;
    R(i,N){static int a; cin>>a,++cnt[--a];}
    ll ns=mycalc(1,12)+mycalc(4,12)*6
        +mycalc(2,12)*3+mycalc(3,12)*8;
    R(i,M)if(cnt[i]){
        --cnt[i];
        R(j,M)if(cnt[j]) --cnt[j],
            ns+=mycalc(2,10)*6,++cnt[j];
        ++cnt[i];
    }
    cout<<ns/24<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    math_init();
    int t; for(cin>>t;t--;Main());
    return 0;
}

AHOI2002 黑白瓷砖

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Num
struct myint{
    static const int N=60,B=10000; int n,arr[N];
    myint(){n=0; R(i,N) arr[i]=0;}
    myint(int x){R(i,N) arr[i]=0; for(n=0;x;arr[n++]=x%B,x/=B);}
    int& operator[](int i){return arr[i];}
    friend myint& operator+=(myint &a,myint b)
        {a.n=max(a.n,b.n); R(i,a.n) a[i+1]+=(a[i]+=b[i])/B,
        a[i]%=B; a[a.n]&&++a.n; return a;}
    friend myint operator+(myint a,myint b){return a+=b;}
    friend myint& operator*=(myint &a,myint b)
        {myint r; r.n=a.n+b.n; R(i,a.n)R(j,b.n)
        r[i+j]+=a[i]*b[j],r[i+j+1]+=r[i+j]/B,r[i+j]%=B;
        !r[r.n-1]&&--r.n; return a=r;}
    friend myint operator*(myint a,myint b){return a*=b;}
    friend myint& operator/=(myint &a,const int x)
        {L(i,a.n) i&&(a[i-1]+=a[i]%x*B),a[i]/=x;
        while(a.n&&!a[a.n-1]) --a.n; return a;}
    friend myint operator/(myint a,const int x){return a/=x;}
    friend ostream& operator<<(ostream &os,myint a)
        {if(a.n==0) return cout<<0,os; (a[a.n-1]/1000)&&
        (cout<<a[a.n-1]/1000),(a[a.n-1]/100)&&(cout<<a[a.n-1]
        %1000/100),(a[a.n-1]/10)&&(cout<<a[a.n-1]%100/10),
        cout<<a[a.n-1]%10; L(i,a.n-1) cout<<a[i]/1000<<a[i]
        %1000/100<<a[i]%100/10<<a[i]%10; return os;}
};
myint pw2(int x){myint res(1),a(2); for(;x;
    x>>=1,a*=a)if(x&1) res*=a; return res;}

//Data
int n,m; myint ns;

//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n,m=n*(n+1)/2,ns=pw2(m);
    ns+=pw2(m/3+m%3)*myint(2);
    ns+=pw2((n+1)/2+(m-(n+1)/2)/2)*myint(3);
    cout<<(ns/=6)<<'\n';
    return 0;
}

SP419 TRANSP - Transposing is Fun

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=1e6;

//Math
const int mod=1000003;
int& fmod(int &x){return x+=x>>31&mod;}
int gcd(int a,int b){return a?gcd(b%a,a):b;}
int mypow(int a,int x=mod-2,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}
int pw2[N|1],gn[N|1];
void math_init(){
    pw2[0]=1;
    R(i,N) fmod(pw2[i+1]=(pw2[i]<<1)-mod);
}

//Main
void Main(){
    static int a,b,g;
    cin>>a>>b,g=gcd(a,b);
    int ns=0,n=(a+b)/g;
    for(int i=1;i<=n;i++) gn[i]=0;
    for(int d=1;d*d<=n;d++)if(n%d==0){
        for(int i=d;i<=n;i+=d) gn[i]=max(gn[i],d);
        if(d*d<n) for(int i=n/d;i<=n;i+=n/d)
            gn[i]=max(gn[i],n/d);
    }
    for(int i=1;i<=n;i++)
        fmod(ns+=pw2[g*gn[i]]-mod);
    ns=1ll*ns*mypow(n)%mod;
    cout<<fmod(ns=pw2[a+b]-ns)<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    math_init();
    int t; for(cin>>t;t--;Main());
    return 0;
}

SP422 TRANSP2 - Transposing is Even More Fun

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=2e6+1;
const int mod=1000003;

//Math
int& fmod(int &x){return x+=x>>31&mod;}
int gcd(int a,int b){return a?gcd(b%a,a):b;}
int mypow(int a,int x=mod-2,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}
bitset<N> np;
vector<int> prime;
int pw2[N],phi[N];
void math_init(){
    pw2[0]=phi[1]=1;
    for(int i=2;i<N;i++){
        if(!np[i]) prime.pb(i),phi[i]=i-1;
        for(int p:prime){
            if(i*p>=N) break;
            np[i*p]=true;
            if(i%p==0){phi[i*p]=phi[i]*p; break;}
            else phi[i*p]=phi[i]*phi[p];
        }
    }
    for(int i=1;i<N;i++) fmod(pw2[i]=(pw2[i-1]<<1)-mod);
}

//Main
void Main(){
    static int a,b,g,n;
    cin>>a>>b,n=(a+b)/(g=gcd(a,b));
    int ns=0;
    for(int d=1;d*d<=n;d++)if(n%d==0){
        fmod(ns+=1ll*phi[n/d]*pw2[g*d]%mod-mod);
        if(d*d<n) fmod(ns+=1ll*phi[d]*pw2[n/d*g]%mod-mod);
    }
    fmod(ns=pw2[a+b]-1ll*ns*mypow(n)%mod);
    cout<<ns<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    math_init();
    int t; for(cin>>t;t--;Main());
    return 0;
}

SHOI2006 有色图

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=54;
int n,m,mod,ns=0;

//Math
int& fmod(int &x){return x+=x>>31&mod;}
int gcd(int a,int b){return a?gcd(b%a,a):b;}
int mypow(int a,int x=mod-2,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}
int inv[N],fac[N],ifac[N];
void math_init(){
    inv[1]=fac[0]=ifac[0]=1;
    for(int i=2;i<=n;i++) fmod(
        inv[i]=-1ll*mod/i*inv[mod%i]%mod);
    R(i,n) fac[i+1]=(1ll+i)*fac[i]%mod,
        ifac[i+1]=1ll*inv[i+1]*ifac[i]%mod;
}

//Function
int sta[N],*ta=sta;
void dfs(int s,int x,int c,int e,int a){
    if(!s){a=1ll*a*ifac[c]%mod; return
        void(fmod(ns+=1ll*mypow(m,e)*a%mod-mod));}
    for(int b=1;b<=x;b++){
        int sc=c+1,se=e+(b>>1),sa=1ll*a*inv[b]%mod;
        for(int *i=sta;i!=ta;se+=gcd(b,*i++));
        if(b!=*(ta-1)) sc=1,sa=1ll*sa*ifac[c]%mod;
        *ta++=b,dfs(s-b,min(s-b,b),sc,se,sa),--ta;
    }
}

//Main
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>mod,math_init();
    cout<<(dfs(n,n,0,0,1),ns)<<'\n';
    return 0;
}

洛谷P6597 烯烃计数

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int pN=1<<18,mod=998244353;
int t3[pN],t2[pN],dt[pN];

//Math
int& fmod(int &x){return x+=x>>31&mod;}
int mypow(int a,int x=mod-2,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}

//Poly
const int G=3,iG=mypow(G);
int pn,rev[pN],red[pN],w[pN|1];
#define cle(p) fill((p)+n,(p)+pn,0)
int up2(int n){return 1<<int(ceil(log2(n)));}
void revn(int n){
    pn=n; R(i,pn) rev[i]=rev[i>>1]>>1|(i&1)*pn>>1;
    const int wn=mypow(G,(mod-1)/pn); int *p=w;
    for(*p=1;p!=w+pn+1;*(p+1)=1ll*(*p)*wn%mod,++p);
}
void ntt(int* p,bool t){
    R(i,pn)if(i<rev[i]) swap(p[i],p[rev[i]]);
    for(int mid=1;mid<pn;mid<<=1)
        for(int i=0,s=pn/mid>>1;i<pn;i+=mid<<1)
            for(int j=i,a=pn*t,x;j<(mid|i);j++,t?a-=s:a+=s)
                x=1ll*p[mid|j]*w[a]%mod,fmod(p[mid|j]=p[j]-x),fmod(p[j]+=x-mod);
    if(t){int in=mypow(pn); R(i,pn) p[i]=1ll*p[i]*in%mod;}
}
void inv(int* p,int* q,int n){
    if(n==1) return void(q[0]=mypow(p[0]));
    inv(p,q,n>>1),revn(n<<1),copy(p,p+n,red),cle(red),cle(q),ntt(red,false),ntt(q,false);
    R(i,pn) fmod(q[i]=(-1ll*red[i]*q[i]%mod+2)*q[i]%mod); ntt(q,true),cle(q);
}

//Function
const int i6=mypow(6),i2=mypow(2);
int Z[pN],Z0[pN],F2[pN],F3[pN],S2[pN],S3[pN],T[pN];
void tree3(int *F,int n){
    if(n==1) return void(F[0]=1);
    tree3(F,n>>1),revn(n<<1),copy(F,F+pn,T),ntt(T,false);
    R(i,pn) F2[i]=1ll*T[i]*T[i]%mod;
    ntt(F2,true),cle(F2),ntt(F2,false);
    R(i,pn) F3[i]=1ll*T[i]*F2[i]%mod; ntt(F3,true),cle(F3);
    R(i,n) S2[i]=(~i&1)?F[i>>1]:0; ntt(S2,false);
    R(i,n) S3[i]=(i%3==0)?F[i/3]:0;
    R(i,pn) Z[i]=3ll*S2[i]%mod*T[i]%mod,
        fmod(Z0[i]=3ll*S2[i]%mod+3ll*F2[i]%mod-mod);
    ntt(Z,true),cle(Z),ntt(Z0,true),cle(Z0);
    R(i,n) fmod(Z[i]+=(2ll*S3[i]%mod+F3[i])%mod-mod);
    L(i,n-1) Z[i+1]=1ll*Z[i]*i6%mod,Z0[i+1]=1ll*Z0[i]*i6%mod;
    Z[0]=1,Z0[0]=mod-1; R(i,n) fmod(Z[i]-=F[i]),T[i]=0;
    inv(Z0,T,n),cle(T),ntt(T,false),ntt(Z,false);
    R(i,pn) Z[i]=1ll*Z[i]*T[i]%mod; ntt(Z,true),cle(Z);
    R(i,n) fmod(F[i]-=Z[i]); cle(F);
}

//Main
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    static int m,n; cin>>m,n=up2(m+1);
    tree3(t3,n),revn(n<<1),copy(t3,t3+pn,T),ntt(T,false);
    R(i,pn) t2[i]=1ll*T[i]*T[i]%mod; ntt(t2,true),cle(t2);
    R(i,n) (~i&1)&&fmod(t2[i]+=t3[i>>1]-mod);
    L(i,n-1) t2[i+1]=1ll*i2*t2[i]%mod; t2[0]=0;
    copy(t2,t2+pn,T),ntt(T,false);
    R(i,pn) dt[i]=1ll*T[i]*T[i]%mod; ntt(dt,true),cle(dt);
    R(i,n) (~i&1)&&fmod(dt[i]+=t2[i>>1]-mod),dt[i]=1ll*i2*dt[i]%mod;
    for(int i=2;i<=m;i++) cout<<dt[i]<<'\n';
    return 0;
}

洛谷P4708 画画

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=51,mod=998244353;
int n,c[N],b[N],ns;

//Math
int& mod_p(int &x){return x<0?x+=mod:x;}
int& mod_s(int &x){return x<mod?x:x-=mod;}
int gcd(int a,int b){return a?gcd(b%a,a):b;}
int inv[N],fac[N],ifac[N],pw2[N*N],g[N][N];
void math_init(){
    inv[1]=fac[0]=ifac[0]=pw2[0]=1;
    for(int i=2;i<=n;i++) mod_p(inv[i]=-1ll*mod/i*inv[mod%i]%mod);
    R(i,n) fac[i+1]=(1ll+i)*fac[i]%mod,ifac[i+1]=1ll*ifac[i]*inv[i+1]%mod;
    R(i,n*n) mod_s(pw2[i+1]=pw2[i]<<1);
    R(i,n+1)R(j,n+1) g[i][j]=gcd(i,j);
}

//Graph
int te[N],sn[N],cn[N],ce[N];
stack<int> s;
int find(int u){
    while(u!=te[u]) s.push(u),u=te[u];
    while(sz(s)) te[s.top()]=u,s.pop();
    return u;
}
void merge(int u,int v,int w){
    u=find(u),v=find(v);
    if(u==v) ce[u]+=w;
    else sn[u]>sn[v]?swap(u,v):void(),
        te[u]=v,sn[v]+=sn[u],cn[v]+=cn[u],ce[v]+=ce[u]+w;
}

//Function
void mycalc(int d){
    // cout<<"d="<<d<<'\n';
    // R(i,d) cout<<b[i]<<'\n';
    int res=1;
    R(u,d) sn[te[u]=u]=1,cn[u]=ce[u]=0;
    for(int i=1;i<=n;i++) res=1ll*res*ifac[c[i]]%mod;
    R(i,d) res=1ll*res*inv[b[i]]%mod;
    R(u,d){
        if(~b[u]&1) ++cn[u];
        res=1ll*res*pw2[(b[u]-1)>>1]%mod; 
    }
    R(u,d)R(v,u){
        int c=g[b[u]][b[v]];
        bool cu=b[v]/c&1,cv=b[u]/c&1;
        if(cu&&cv) merge(u,v,c);
        else if(cu) cn[find(u)]+=c;
        else if(cv) cn[find(v)]+=c;
        else res=1ll*res*pw2[c]%mod;
    }
    R(u,d)if(find(u)==u) res=1ll*res
        *pw2[(cn[u]?cn[u]-1:0)+ce[u]-sn[u]+1]%mod;
    mod_s(ns+=res);
    // cout<<"res="<<res<<'\n';
}
void dfs(int d,int s,int m){
    if(!s) return mycalc(d);
    for(int i=m;i<=s;i++)
        ++c[b[d]=i],dfs(d+1,s-i,i),--c[i];
}


//Main
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n,math_init(),dfs(0,n,1),cout<<ns<<'\n';
    return 0;
}

HNOI2008 Cards

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);i>=0;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=61;
int n,m,a,b,c,per[N][N],mod;
int f[2][N][N][N],ns;

//Math
int& mod_p(int &x){return x<0?x+=mod:x;}
int& mod_s(int &x){return x<mod?x:x-=mod;}
int mypow(int a,int x=mod-2,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}

//Graph
int te[N],sn[N];
int find(int u){return u==te[u]?u:te[u]=find(te[u]);}
void merge(int u,int v){
    u=find(u),v=find(v);
    if(u!=v) sn[u]>sn[v]?swap(u,v):void(),
        te[u]=v,sn[v]+=sn[u];
}

//Function
void solve(int* p){
    R(u,n) sn[te[u]=u]=1;
    R(u,n) merge(u,p[u]);
    int now=0;
    R(i,a+1)R(j,b+1)R(k,c+1) f[now][i][j][k]=0;
    f[now][0][0][0]=1;
    R(u,n)if(find(u)==u){
        R(i,a+1)R(j,b+1)R(k,c+1) f[now^1][i][j][k]=0;
        int x=-1;
        R(i,a+1)R(j,b+1)R(k,c+1)if((x=f[now][i][j][k])){
            if(i+sn[u]<=a) mod_s(f[now^1][i+sn[u]][j][k]+=x);
            if(j+sn[u]<=b) mod_s(f[now^1][i][j+sn[u]][k]+=x);
            if(k+sn[u]<=c) mod_s(f[now^1][i][j][k+sn[u]]+=x);
        }
        now^=1;
    }
    mod_s(ns+=f[now][a][b][c]);
}

//Main
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>a>>b>>c>>m>>mod,n=a+b+c;
    R(i,m)R(j,n) cin>>per[i][j],--per[i][j];
    R(i,n) per[m][i]=i; ++m;
    R(i,m) solve(per[i]); ns=1ll*ns*mypow(m)%mod;
    cout<<ns<<'\n';
    return 0;
}

posted @ 2020-12-21 12:50  George1123  阅读(9)  评论(0编辑  收藏  举报