[洛谷P4388] 付公主的矩形
2024-08-28 11:02:17
18.09.09模拟赛T1。
一道数学题。
首先把对角线当成是某个点的移动轨迹,从左下到右上。
那么这个点每上升一个单位长度,就穿过一个格子。
每右移一个单位长度,也会穿过一个格子。
例外:穿过格点,会减少穿过的格子数。
初步的结论:R*C的矩形,对角线穿过的格子数N=R+C-gcd(R,C)。
那么我们只需算出这个方程的解的个数。
可以看出,R、C和gcd(R,C)都是gcd(R,C)的倍数。
那么N显然也是。
设N/gcd(R,C)=n,R/gcd(R,C)=r,C/gcd(R,C)=c。
方程两边同除gcd(R,C):n=r+c-1。
由欧几里得算法可得:gcd(n+1,r)=gcd(n+1-r,r)=gcd( (r+c-1) +1-r,r)=gcd(c,r)。
这时候r和c一定是互质的,假如它们有公因数,在除以gcd(R,C)时就会被除掉。
所以:gcd(r,c)=1。得:gcd(n+1,r)=1。
即:n+1与r互质,n是N得因数。
答案即为:
所以我们线性筛出从2到n+1的欧拉函数phi [ i ],挑出其中i-1是n的因数的,把它们的phi [ i ]加起来就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,cnt,ans;
int pr[];
bool v[];
int phi[]; int main()
{
scanf("%d",&n);
for(int i=;i<=n+;i++)
{
if(!v[i])
{
pr[++cnt]=i;
phi[i]=i-;
}
if(n%(i-)==)ans+=phi[i];
for(int j=;(j<=cnt)&&(i*pr[j]<=n+);j++)
{
v[i*pr[j]]=true;
if(i%pr[j]==)
{
phi[i*pr[j]]=phi[i]*pr[j];
break;
}else
{
phi[i*pr[j]]=phi[i]*phi[pr[j]];
}
}
}
printf("%d",(ans+)/);
return ;
}
最新文章
- Sql Server中暂停命令
- Calculator(补)
- LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- PTA作业
- MySQL函数汇总
- Codeforces Round #331 (Div. 2) E. Wilbur and Strings dfs乱搞
- H5小内容(六)
- 30.SSH配置文件模板.md
- [html] 学习笔记-Canvas使用路径
- cache2go源码最后一讲 - examples
- 设备arduino的编译目录
- Nginx的配置与部署研究,Upstream负载均衡模块
- pytest十:用例 a 失败,跳过测试用例 b 和 c 并标记失败 xfail
- SSM集成activiti6.0错误集锦(二)
- 雷林鹏分享:XML 属性
- jquery页面隐藏和展开之间切换
- python中操作mysql
- art.dialog 使用说明
- 使用 Idea 打 scala程序的 jar 包 - 02
- 【转】inittab文件
热门文章
- PAT Advanced 1033 To Fill or Not to Fill (25) [贪⼼算法]
- 第二季第十一天 html5语义化标签 css透明度
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
- StringBuiler和StringBuffer的区别
- recurrent NN
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:TensorFlow图像处理函数
- PCA|factor extraction|CA
- video文件转blob
- linux 上安装 tomcat
- vue中axios的post请求使用form表单格式发送数据