题意:一个$n\times n$的有标号点阵,现在用一条直线把它们分成两部分,问有多少种不同的分法

结论:方案数就是以点阵上的点为端点且不经过第三个点的线段数

对一个满足要求的线段,将其绕中点顺时针转一个小角度,所在直线是一种切割方案

对于一种分割方案,把直线逆时针旋转直到卡住,卡到的两个点(在原直线的两边且最近的点对)可以连出一条线段

水平竖直的答案为$2n(n-1)$,斜向的答案是$2\sum\limits_{i=1}^n\sum\limits_{j=1}^n(n-i)(n-j)[(i,j)=1]$

后面的sigma可以写成$(n-1)^2+2\sum\limits_{i=1}^n\sum\limits_{j=1}^{i-1}(n-i)(n-j)[(i,j)=1]$

一个结论是$\sum\limits_{i=1}^{n-1}i[(n,i)=1]=\frac{n\varphi(n)}2(n\geq2)$,这是因为在$n\geq3$时如果$(n,i)=1$那么$(n,n-i)=1$,刚好配成$\frac{\varphi(n)}2$对,而在$n=2$时又刚好满足

所以它又可以化成$\sum\limits_{i=2}^n(n-i)\left(n\varphi(i)-\frac{i\varphi(i)}2\right)$,展开后本质是求$\sum\limits_{i=1}^ni^k\varphi(i)$

因为$\sum\limits_{d|n}d^k\varphi(d)\left(\frac nd\right)^k=n^{k+1}$,所以直接杜教筛即可

#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
const int T=1000000;
int p;
int mul(int a,int b){return a*(ll)b%p;}
int pr[T+10],phi[T+10],phk[T+10][3];
bool np[T+10];
void sieve(){
	int i,j,M=0;
	phi[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			pr[++M]=i;
			phi[i]=i-1;
		}
		for(j=1;j<=M&&i*pr[j]<=T;j++){
			np[i*pr[j]]=1;
			if(i%pr[j]==0){
				phi[i*pr[j]]=phi[i]*pr[j];
				break;
			}
			phi[i*pr[j]]=phi[i]*(pr[j]-1);
		}
	}
	for(i=1;i<=T;i++){
		phk[i][0]=(phk[i-1][0]+phi[i])%p;
		phk[i][1]=(phk[i-1][1]+mul(i,phi[i]))%p;
		phk[i][2]=(phk[i-1][2]+mul(mul(i,i),phi[i]))%p;
	}
}
map<int,int>g;
int pre(int k,int n){
	if(k==0)return n;
	if(k==1)return(ll)n*(n+1)/2%p;
	if(k==2)return(__int128)n*(n+1)*(2*n+1)/6%p;
	return((ll)n*(n+1)/2%p)*((ll)n*(n+1)/2%p)%p;
}
int S(int k,int n){
	if(n<=T)return phk[n][k];
	if(g.count(n))return g[n];
	int s=pre(k+1,n),i,nex;
	for(i=2;i<=n;i=nex+1){
		nex=n/(n/i);
		(s-=mul(pre(k,nex)-pre(k,i-1),S(k,n/i)))%=p;
	}
	return g[n]=s;
}
int getT(int n){
	int s=mul(mul(n,n),S(0,n)-1),t;
	g.clear();
	t=mul(S(1,n)-1,3);
	if(~t&1)
		t>>=1;
	else
		t=mul(t,(p+1)/2);
	(s-=mul(n,t))%=p;
	g.clear();
	t=S(2,n)-1;
	if(~t&1)
		t/=2;
	else
		t=mul(t,(p+1)/2);
	(s+=t)%=p;
	return s;
}
int main(){
	int n;
	scanf("%d%d",&n,&p);
	sieve();
	printf("%lld",((mul(2*n,n-1)+2ll*(mul(n-1,n-1)+2ll*getT(n)))%p+p)%p);
}

[xsy2282]cake的更多相关文章

  1. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  2. 2015暑假多校联合---Cake(深搜)

    题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...

  3. Scalaz(15)- Monad:依赖注入-Reader besides Cake

    我们可以用Monad Reader来实现依赖注入(dependency injection DI or IOC)功能.Scala界中比较常用的不附加任何Framework的依赖注入方式可以说是Cake ...

  4. uva10167 Birthday Cake

    Lucy and Lily are twins. Today is their birthday. Mother buys a birthday cake for them. Now we put t ...

  5. HDU 4762 Cut the Cake(公式)

    Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. Brute Force --- UVA 10167: Birthday Cake

     Problem G. Birthday Cake  Problem's Link:http://uva.onlinejudge.org/index.php?option=com_onlinejudg ...

  7. 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest, B. Layer Cake

    Description Dasha decided to bake a big and tasty layer cake. In order to do that she went shopping ...

  8. hdu acmsteps 2.1.3 Cake

    Cake Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  9. ZOJ 3905 Cake ZOJ Monthly, October 2015 - C

    Cake Time Limit: 4 Seconds      Memory Limit: 65536 KB Alice and Bob like eating cake very much. One ...

随机推荐

  1. Problem B. Harvest of Apples(杭电2018年多校+组合数+逆元+莫队)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6333 题目: 题意:求C(n,0)+C(n,1)+……+C(n,m)的值. 思路:由于t和n数值范围太 ...

  2. HDU 1234 开门人和关门人 (模拟)

    题目链接 Problem Description 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签  到.签离记录,请根据记录找出当天开门和关门的人.    Input ...

  3. fundamentals of the jQuery library

    1.why is jquery Only 32kB minified and gzipped. Can also be included as an AMD module Supports CSS3 ...

  4. AlertDialog.Builder 显示为白色 蓝色字

    AlertDialog.Builder dialog = new AlertDialog.Builder( getActivity(),AlertDialog.THEME_HOLO_LIGHT);

  5. Linux 入门记录:二、Linux 文件系统基本结构

    一.树状目录结构 Linux 文件系统是一个倒置的单根树状结构.文件系统的根为"/":文件名严格区分大小写:路径使用"/"分割(Windows 中使用" ...

  6. c++ ui 库

    Dulib 比较流行的direct ui 界面框架 UIStone 据说金山词霸用着,查询资料甚少 DirectUI qq使用了据说,多学习学习吧 基于directUI的dulib不错 c盘没空间,运 ...

  7. RadioButton 带下划线切换的案例

    xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id=& ...

  8. Mybatis学习—入门

    总结自 Mybatis官方中文文档 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手 ...

  9. Disruptor 线程间共享数据无需竞争

    队列的作用是缓冲 缓冲到 队列的空间里.. 线程间共享数据无需竞争 原文 地址  作者  Trisha   译者:李同杰 LMAX Disruptor 是一个开源的并发框架,并获得2011 Duke’ ...

  10. Python Flask 蓝图Blueprint

    1. 目录结构 2. manage.py类似于django中manage import fcrm if __name__ == '__main__': fcrm.app.run(port=8001) ...