题意:一个$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. 总有你要的编程书单(GitHub )

    目录 IDE IntelliJ IDEA 简体中文专题教程 MySQL 21分钟MySQL入门教程 MySQL索引背后的数据结构及算法原理 NoSQL Disque 使用教程 Neo4j .rb 中文 ...

  2. hdu 1232 畅通工程(并查集算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    M ...

  3. 【Git/GitHub学习笔记】基本操作——创建仓库,本地、远程同步等

    近日想分享一些文件,但是用度盘又太麻烦了(速度也很恶心).所以突发奇想去研究了下GitHub的仓库,这篇文章也就是一个最最最基础的基本操作.基本实现了可以在GitHub上存储文本信息与代码. 由于我的 ...

  4. 关闭自动弹出照片自动弹出iTunes以及关闭手机照片流

    关闭自动弹出照片自动弹出iTunes以及关闭手机照片流 如何阻止iPhone连接Mac后自动弹出照片? 时间:2015/6/18 17:07:15来源:本站原创作者:Chenjh我要评论 很多新 iP ...

  5. win10出现"win10系统即将过期,请激活"的处理办法

    当打开电脑时,出现"你的win10系统即将过期,请前往激活”的提示.上网查了解决方案,避免以后在出现这样的情况,现将解决步骤整理如下: 1.下载KMSpico激活软件,百度网盘下载链接如下: ...

  6. ASPxTreeList的右键按钮事件

    ASPxTreeList应该是比较长用的控件了~现在就来说说它的右键按钮事件 这里实现的是右键里有折合和展开所有节点的功能 code: <dx:ASPxTreeList ID="ASP ...

  7. artdialog自定义多个按钮

    在实际运用到的过程中artdialog弹出框下面的按钮不止一个 可以自己定义多个按钮 function view_show(cust_id){$.dialog({        id: 'view_c ...

  8. stl 学习笔记

    1. Erasing multiple objects from a std::vector https://stackoverflow.com/questions/3487717/erasing-m ...

  9. 导出数据到word

    打野的时候,碰到一个需求,导出简历信息. 两条思路: 第一条,直接画所有的表格,填充数据. 第二条,加载一个空的模板,然后填充数据. 因为导出的有格式的,所以最后选择了使用模板进行替换,然后填充数据. ...

  10. iis频繁奔溃,求大神帮忙分析dump

    直接上图了 上图三个错误最近频繁出现,出现一次iis就奔溃一次,抓取的dump分析后如下: Couldn't resolve error at 'ls' :> !analyze -v ***** ...