BZOJ 1488: [HNOI2009]图的同构
2016-03-31 14:30
302 查看
同SHOI2006图的染色
只是这题只有两种颜色,即边选或不选
然后套用08年论文里的方法,循环节的长度进行划分
大概划分方案有10^6左右
对要用到的一些东西进行预处理,比如说逆和幂。
然后再算上循环节的计算,大概是O(N*10^6)左右的复杂度,就可以过了。
(话说这个在OEIS上是不是有啊,首页上0MS的大爷们都是怎么写的啊)
只是这题只有两种颜色,即边选或不选
然后套用08年论文里的方法,循环节的长度进行划分
大概划分方案有10^6左右
对要用到的一些东西进行预处理,比如说逆和幂。
然后再算上循环节的计算,大概是O(N*10^6)左右的复杂度,就可以过了。
(话说这个在OEIS上是不是有啊,首页上0MS的大爷们都是怎么写的啊)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int p=997; ll qmul(ll a,ll b){ ll ans=1; for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p; return ans; } ll inv[70],xp[1005]; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } ll ans,l[70],tot,m,n; ll delta(ll x){ ll ans=0; for(int i=1;i<=tot;i++) ans+=gcd(x,l[i]); return ans+=x/2; } void dfs(int last,int k,int n,ll s,ll f){ int t=s*inv %p; if(n==last)t=t*inv[k+1]%p; ans=(ans+t*xp[(f+delta(n))%(p-1)]%p)%p; for(int j=last;j<=n-j;j++){ ll tmp=delta(j); l[++tot]=j; int t=s*inv[j]%p; if(j==last)dfs(j,k+1,n-j,t*inv[k+1]%p,f+tmp); else dfs(j,1,n-j,t*inv[1]%p,f+tmp); tot--; } } int main(){ //freopen("a.in","r",stdin); scanf("%lld",&n); for(int i=1;i<=n;i++)inv[i]=qmul(i,p-2); xp[0]=1; for(int i=1;i<=p;i++)xp[i]=(xp[i-1]<<1)%p; ll s=1; for(int i=1;i<=n;i++)s=s*i%p; dfs(1,0,n,s,0); for(int i=1;i<=n;i++)ans=ans*inv[i]%p; printf("%lld\n",ans); return 0; }
相关文章推荐
- 二叉树的非递归遍历
- 在Gridview中 实现textview的跑马灯效果
- H5小游戏的坑点小结
- H.264码流解析 一个SPS的nalu及获取视频的分辨率
- 随想
- 关于澳洲移民
- nysql access denied for user "root"解决办法
- 用BaseAdapter解决Listview列表项中的子控件无法获得焦点
- MT,MTd,MD,MDd详解解决 MSVCRTD.LIB和LIBCMTD.LIB冲突
- Python代码分析工具:PyChecker、Pylint
- bzoj 1492 货币兑换Cash (splay 斜率优化)
- Installation error: INSTALL_FAILED_OLDER_SDK
- 游戏运维编年史:可能是目前最详细游戏运维指南
- oracle Form Builer:FIND_FORM Built-in
- MySQL DBA面试全揭秘
- BUG汇总
- Java线程池基本使用
- android实现程序启动直接调用系统默认浏览器
- input type =text,按回车键自动提交
- C++中冒号(:)和双冒号(::)的用法