BZOJ1172 : [Balkan2007]Dream
2015-12-10 00:02
246 查看
$\gcd(ab,k)=\gcd(\gcd(a,k)\times \gcd(b,k),k)$
设$f[i][j]$表示前$i$行,与$k$的$\gcd$为$j$的方案数,$h[i]$表示当前行选一个或两个,乘积与$k$的$\gcd$为$i$的方案数,然后DP即可。
时间复杂度$O(N(M+K))$。
设$f[i][j]$表示前$i$行,与$k$的$\gcd$为$j$的方案数,$h[i]$表示当前行选一个或两个,乘积与$k$的$\gcd$为$i$的方案数,然后DP即可。
时间复杂度$O(N(M+K))$。
#include<cstdio> #define N 165 typedef long long ll; int n,m,K,L,i,j,k,d,a ,id[200005],g ,c ,h ,f[205] ; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline void up(int&x,int y){x=(x+y)%L;} int main(){ read(n),read(m),read(K),read(L); for(i=1;i<=K;i++)if(K%i==0)a[++d]=i,id[i]=d; for(i=1;i<=d;i++)for(j=1;j<=d;j++)g[i][j]=id[gcd(1LL*a[i]*a[j],K)]; for(f[0][1]=i=1;i<=n;i++){ for(j=1;j<=d;j++)c[j]=h[j]=0; for(j=1;j<=m;j++)read(k),c[id[gcd(k,K)]]++; for(j=1;j<=d;j++)up(h[j],c[j]); if(i>1&&i<n){ for(j=1;j<=d;j++)up(h[g[j][j]],c[j]*(c[j]-1)); for(j=1;j<=d;j++)for(k=1;k<j;k++)up(h[g[j][k]],c[j]*c[k]*2); } for(j=1;j<=d;j++)for(k=1;k<=d;k++)up(f[i][g[j][k]],f[i-1][j]*h[k]); } return printf("%d",f [d]),0; }
相关文章推荐
- 设计模式----命令模式UML和实现代码
- QT学习交流群
- 自学QT之qFind的用法
- 自学QT之static_cast<int>
- win8/win10操作系统如何通过Legacy BIOS与UEFI两种模式安装
- 自学QT之QT开发文件MD5计算器源码
- BIOS和CMOS的区别
- 自学QT之QT写的程序是否必须开源?
- 自学QT之数字时钟
- Git for windows安装出错的解决办法
- 自学Qt之中文显示(QMessageBox、QLineEdit右键菜单等)
- 自学QT之QMutableListIterator
- 自学QT之歌曲列表
- 自学QT之从对话框弹出对话框
- 自学QT之获取目录下的全部文件并且添加到tablev中
- 自学QT之实现窗口分割QSplitter的使用
- 自学QT之堆栈窗口
- UEFI装系统不能从U盘启动的解决办法
- 自学QT之实现窗口移动
- 自学QT之任务栏预览视图按钮