P4388 付公主的矩形

前置芝士

\(gcd\)与欧拉函数

要求对其应用于性质比较熟,否则建议左转百度

思路

有\(n×m\)的矩阵,题目要求对角线经过的格子有\(N\)个,

设函数\(f(x,y)\)为矩阵\((x,y)\)对角线经过的格子

设\(gcd(n,m)=1\),对角线在矩形中不会经过任意一个格点,\(f(n,m)=n+m-1\)

那\(gcd(n,m)!=1\)呢?将这个矩阵拆除\(gcd(n,m)\)个相同的矩阵

其中\(gcd(n',m')=1\),则\(\dfrac{n}{n'}=\dfrac{m}{m'}\)

所以我们能推倒出公式

\(f(n,m)=\dfrac{n}{n'}f(n',m')\)

\(~~~~~~~~~~~~~=\dfrac{n}{n'}×(n'+m'-1)\)

\(~~~~~~~~~~~~~=\dfrac{n×n'}{n'}+\dfrac{m×m'}{m'}-gcd(n,m)\)

\(~~~~~~~~~~~~~=n+m-gcd(n,m)\)

则我们要求\((n,m)\)的对数使得 \(n+m-gcd(n,m)=N\)

设\(i=gcd(n,m)\)

$n+m-gcd(n,m)=N $

\(\Rightarrow \dfrac{n}{i}+\dfrac{m}{i}-1=\dfrac{N}{i}\)

\(\Rightarrow \dfrac{n}{i}+\dfrac{m}{i}=\dfrac{N}{i}+1\)

我们枚举\(gcd(n,m)\)也就是\(i\),那我们怎么求呢?

欧拉函数有一性质\(\varphi(N)\),\(N>2\)时,\(\varphi(N)\)为偶数

所以\(nun=\varphi(\dfrac{N}{i}+1)\)

跑得比较慢(200ms)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=1000007;
LL n,tot,ans;
LL phi[maxn],pim[maxn>>1];
inline void First(){
for(LL i=2;i<=n+1;i++){
if(!phi[i])
phi[i]=i-1,
pim[++tot]=i;
for(LL j=1;j<=tot&&pim[j]*i<maxn;j++)
if(i%pim[j]==0){
phi[i*pim[j]]=phi[i]*pim[j];
break;
}else
phi[i*pim[j]]=phi[i]*(pim[j]-1);
}
}
int main () {
scanf("%lld",&n);
First();
for(LL i=1;i<=n;i++)
if(n%i==0)
ans+=phi[n/i+1];
printf("%lld",ans+1>>1);
return 0;
}

剪一下枝(100ms)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
inline int Read(){
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
const LL maxn=1000007;
int n,tot;
int phi[maxn],pim[maxn>>1];
LL ans;
inline void First(){
for(int i=2;i<=n+1;i++){
if(!phi[i])
phi[i]=i-1,
pim[++tot]=i;
for(int j=1;j<=tot&&pim[j]*i<maxn;j++)
if(i%pim[j]==0){
phi[i*pim[j]]=phi[i]*pim[j];
break;
}else
phi[i*pim[j]]=phi[i]*(pim[j]-1);
}
}
int main () {
n=Read();
First();
for(int i=1;i*i<=n;i++)
if(n%i==0)
if(i*i==n)
ans+=phi[i+1];
else
ans+=phi[i+1]+phi[n/i+1];
printf("%lld",ans+1>>1);
return 0;
}

P4388 付公主的矩形(gcd+欧拉函数)的更多相关文章

  1. BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数

    BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行 ...

  2. [洛谷P4388] 付公主的矩形

    18.09.09模拟赛T1. 一道数学题. 题目传送门 首先把对角线当成是某个点的移动轨迹,从左下到右上. 那么这个点每上升一个单位长度,就穿过一个格子. 每右移一个单位长度,也会穿过一个格子. 例外 ...

  3. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  4. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  5. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  6. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  7. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  8. hdu2588 gcd 欧拉函数

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

随机推荐

  1. Spring使用经验之StandardServletMultipartResolver实现文件上传的基本配置

    Note:Spring使用版本是4.1.6.RELEASE 1. 在实现了AbstractAnnotationConfigDispatcherServletInitializer的类中重载custom ...

  2. java检测http请求的ip地址 Java问题通用解决代码

    以后再用到的话,至少能起个参考作用 java实现,struts2的Action中,依赖HttpServletRequest     package net.dookoo.web.action;   i ...

  3. sublime livereload插件

    1.首先在chrome商店下载livereload 安装之后记得在 chrome 的 扩展程序 里面 勾上 允许访问文件地址 2.sublime text 3 中下载插件 Livereload 3.配 ...

  4. js中删除数组元素的几种方法

    1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...

  5. IMSDroid问题集

    1.IMSDroid切换摄像头后的接收方横屏显示.事实上非常多种情况下都会突然发现就横屏了.解决的方法就是切换摄像头时同一时候切换横竖屏显示 2.IMSDroid掉音问题:IMSDroid通话几分钟后 ...

  6. Atitit.常见的4gl 第四代编程语言  与 dsl

    Atitit.常见的4gl 第四代编程语言  与 dsl 1. 4gl dsl发展历史1 2. 4gl dsl的特点1 3. 常见的4gl 第四代编程语言 dsl2 4. 未来趋势与标准2 4.1.1 ...

  7. 二路归并排序的java实现

    转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之 ...

  8. nginx反向代理做cache配置

    前序:请耐性子看完,前面的这个配置可以达到按后缀名进行缓存,但无法被purge.后面的配置可以被purge.具体实施方案按个人情况而定. 需要第三方的ngx_cache_purge模块:wget ht ...

  9. php序列化与反序列化

    php序列化简单来说就是 把复杂的数据类型压缩到一个字符串中php对象转换成字符串,反序列化就是把变量转换成对象 一般来说  当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用ur ...

  10. 用android studio创建第一个安卓程序加载html5 页面

    前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本. 动机:由于工作中需要对移动端软件 ...