首页 > 其他分享 >P4980 【模板】Pólya 定理

P4980 【模板】Pólya 定理

时间:2023-01-12 20:13:29浏览次数:61  
标签:P4980 cnt frac int ll lya ans 模板 mod

作为板子题,先上公式:

\[|X/G|=\frac 1{|G|}\sum_{g\in G} |B|^{c(g)} \]

显然,\(|G|=n\)

用 \(g_i\) 表示旋转 \(i\) 个的置换,则 \(c(g_i)=(n,i)\)

我们要算下式:

\[\begin{aligned} &\frac 1n\sum_{i=1}^n n^{(n,i)} \\ =&\frac 1n\sum_ {d\mid n} n^d\cdot \sum_{i=1}^n [(n,i)=d] \\ =&\frac 1n\sum_{d\mid n} n^d\cdot \varphi(\frac nd) \end{aligned}\]

本题中直接暴力计算 \(\varphi\) 可以通过。

分析复杂度可参见本文

复杂度 \(\mathcal O(Tn^{\frac 34})\)

或者考虑利用该博客中的法二计算。

但考虑到实际上 \(d(n)\) 远小于 \(\sqrt n\)(当 \(n\) 足够大时,\(d(n)\cdot \log n\) 也小于 \(\sqrt n\)),所以法二的单次复杂度就是 \(\mathcal O(\sqrt n)\) 的。

我的程序使用方法二,复杂度 \(\mathcal O(T\sqrt n)\)

$\textsf {View Code}$
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
char buf[1<<14],*p1=buf,*p2=buf;
#define GetC() ((p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<14,stdin),p1==p2)?EOF:*p1++)
struct Ios{}io;
template <typename _tp>
Ios &operator >>(Ios &in,_tp &x){
	x=0;int w=0;char c=GetC();
	for(;!isdigit(c);w|=c=='-',c=GetC());
	for(;isdigit(c);x=x*10+(c^'0'),c=GetC());
	if(w) x=-x;
	return in;
}
const int mod=1e9+7,N=30;
using ll=long long;
ll qpow(ll a,int b){
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		b=b>>1;a=a*a%mod;
	}
	return ans;
}
int q[N],num[N],cnt;
int ans,n;
void dfs(int stp,int d,int phi){
	if(stp>cnt){
		ans=(ans+qpow(n,n/d)*phi%mod)%mod;
		return ;
	}
	dfs(stp+1,d,phi);
	int t=1;
	for(int i=1;i<=num[stp];++i){
		dfs(stp+1,d*t*q[stp],phi*t*(q[stp]-1));
		t*=q[stp];
	}
}
int main(){
	int T;io>>T;
	while(T--){
		io>>n;
		cnt=0;
		int tmp=n;
		for(int i=2;1ll*i*i<=n;++i){
			if(n%i==0){
				q[++cnt]=i;
				num[cnt]=0;
				while(n%i==0) n/=i,++num[cnt];
			}
		}
		if(n>1){
			q[++cnt]=n;num[cnt]=1;
		}
		n=tmp;
		dfs(1,1,1);
		printf("%lld\n",(ll)ans*qpow(n,mod-2)%mod);
		ans=0;
	}
	return 0;
}

标签:P4980,cnt,frac,int,ll,lya,ans,模板,mod
From: https://www.cnblogs.com/pref-ctrl27/p/17046054.html

相关文章

  • JS封装类通用模板
    频繁写封装类太麻烦,发个模板记录一下,下次直接用。调用示例lettc=newTestClass();console.log(tc.data2);tc.fn2(); 封装模板varTestClass=(function(){......
  • 一个写得很好的gitlab.yml模板(有Windows和Ubuntu)
    出自这个GitHub:https://github.com/nanoporetech/scrappie/blob/master/.gitlab-ci.yml#YamlCIconfigforGitlabSee.http://docs.gitlab.com/ce/ci/yaml/README.ht......
  • 网络流模板及易错点总结
    网络流模板及易错点总结一、最大流#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintNN=300,MM=5e3+8,INF=0x7f7f7f7f;intn,m,......
  • 抽象代数:置换群,Burnside 引理和 Polya 定理
    群群的定义给定集合\(G\)和二元运算\(\cdot\)满足如下性质:封闭性:\(\foralla,b\inG\),有\((a\cdotb)\inG\)结合律:\(\foralla,b,c\inG\),有\((a\cdotb)\cdot......
  • laravel的后台模板
    文档地址:​​https://learnku.com/docs/dcat-admin/2.x​​安装是出现:​​SQLSTATE[42000]:Syntaxerrororaccessviolation:1071Specifiedkeywastoolong;maxkey......
  • DataEase 数据源插件开发——如何替换 STGroupFile 模板文件
    在DataEase的数据源中,使用了STGroupFile模板文件,默认加载的模板文件为dataease-extension-sdk项目中的pluginSqltemplate.stg文件,如下图所示此文件中声明了SQL的......
  • 滑动窗口【模板题】
    滑动窗口给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动......
  • STM32掌机教程3,工程模板与带灯按键测试
    我们需要“脚手架”  关于代码,我想体现出这么一个过程:我是如何一步一步修改代码的。我认为,从学习的角度来考虑,直接看最终的代码没有什么意义。写代码就像工人盖房子,盖房......
  • 如何发布组件模板?
    前置准备:完成设计制作的组件模板具体步骤:提交模板(编辑器内提交后可以在本账号下进行复用)补充模板信息提交审核进行上架步骤分解:编辑器发布点击提交模板按钮选择要发布......
  • 即时(just-in-time) 的TOGAF模板
    翻译文章VisualParadigm (https://www.visual-paradigm.com/features/just-in-time-togaf-templates/) 即时(just-in-time)的TOGAF模板(Template)敏捷(Agile),可定制......