3505: [Cqoi2014]数三角形 组合数学
2016-01-21 16:39
381 查看
找规律就行了。。
首先所有的情况是C((n+1)*(m+1),3)。
水平+竖直共线的情况是(n+1)*C(m+1,3)+(m+1)*C(n+1,3).
剩下的就是斜着的情况:枚举i,j,代表两点为(1,i),(j,1)。然后令d=gcd(i,j),那么两点之间一定有d-1个点(所以要保证d>=2),那么现在不合法的情况有2*(d-1)(n+1-i)(m+1-j)。注意有两个方向所以要*2。
首先所有的情况是C((n+1)*(m+1),3)。
水平+竖直共线的情况是(n+1)*C(m+1,3)+(m+1)*C(n+1,3).
剩下的就是斜着的情况:枚举i,j,代表两点为(1,i),(j,1)。然后令d=gcd(i,j),那么两点之间一定有d-1个点(所以要保证d>=2),那么现在不合法的情况有2*(d-1)(n+1-i)(m+1-j)。注意有两个方向所以要*2。
#include<iostream> #include<cstdio> #define ll long long using namespace std; int n,m; ll ans; ll c[1002005][4]; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline void C() { c[0][0]=1; for (int i=1;i<=(n+1)*(m+1);i++) { c[i][0]=1; for (int j=1;j<=3;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; } } int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { n=read(); m=read(); C(); ans=c[(n+1)*(m+1)][3]-(n+1)*c[m+1][3]-(m+1)*c[n+1][3]; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { int d=gcd(i,j); if (d>=2) ans-=2*(d-1)*(n+1-i)*(m+1-j); } cout << ans; return 0; }
相关文章推荐
- Oracle-本地连接没问题,远程连接有问题解决方案
- 总结移动端页面开发时需要注意的一些问题
- ADO.NET中的五个主要对象
- hdu 1250 Hat's Fibonacci
- uva11292----Dragon of Loowater
- 华硕X550VC安装deepin无线问题解决
- eclipse从数据库逆向生成Hibernate实体类
- SQLite学习整理
- ZOJ1005
- first blog
- Java for Web学习笔记(十四):JSP(4)JSP Tag
- hdu 2459
- 关于自动布局的问题 for storyboard问题 and aotulayout问题
- 点击验证码重新刷新
- JVM学习篇(1)之组成结构
- Java学习第10天(5):异常机制-Runtime异常
- 【数据结构】二叉树
- Intent的属性以及intent的配置使用
- DbExpressionBinding requires an input expression with a collection ResultType. 参数名: input
- 浏览器对document.all的支持差异