洛谷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;
}