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;
}

最新文章

  1. jQuery 选择同时包含两个class的元素的实现方法
  2. C#:额外知识点
  3. React(JSX语法)----JSX拼写
  4. iOS开发UI篇—iOS开发中三种简单的动画设置
  5. sprint1的个人总结及《构建之法》8、9、10章读后感
  6. 用CSS为表格添加边框
  7. TI CC2541增加一个可读写, 又可以Notify的特征字
  8. activeMQ下载,安装,启动,关闭
  9. Html.DropDownListFor
  10. JDK8新特性之Lambda表达式
  11. 【实习记】2014-08-23网络安全XSS与CSRF总结
  12. ADF 项目创建流程
  13. Ubuntu--有关VMware Tools安装问题
  14. 记一次解析XML转对象的笔记
  15. 7.7 WPF后台代码绑定如果是属性,必须指定一下数据上下文才能实现,而函数(click)就不用
  16. Nginx概述和安装(1)
  17. [Swift]LeetCode942. 增减字符串匹配 | DI String Match
  18. django 防止xss攻击标记为安全的二种方法
  19. Java框架spring 学习笔记(十四):注解aop操作
  20. 【转】XML 特殊字符处理

热门文章

  1. maven nexus myeclipse 学习
  2. MVC组件分析
  3. 解决PHP显示Warning和Notice等问题
  4. call_user_func — 把第一个参数作为回调函数调用
  5. html及css
  6. html中keydown事件
  7. hadoop partitioner个数与reducer个数的试验
  8. SQL-SQL基础
  9. IOS启动页动画(uiview 淡入淡出效果 )2
  10. Android拍照后更新相册