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

最新文章

  1. Sql Server中暂停命令
  2. Calculator(补)
  3. LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  4. PTA作业
  5. MySQL函数汇总
  6. Codeforces Round #331 (Div. 2) E. Wilbur and Strings dfs乱搞
  7. H5小内容(六)
  8. 30.SSH配置文件模板.md
  9. [html] 学习笔记-Canvas使用路径
  10. cache2go源码最后一讲 - examples
  11. 设备arduino的编译目录
  12. Nginx的配置与部署研究,Upstream负载均衡模块
  13. pytest十:用例 a 失败,跳过测试用例 b 和 c 并标记失败 xfail
  14. SSM集成activiti6.0错误集锦(二)
  15. 雷林鹏分享:XML 属性
  16. jquery页面隐藏和展开之间切换
  17. python中操作mysql
  18. art.dialog 使用说明
  19. 使用 Idea 打 scala程序的 jar 包 - 02
  20. 【转】inittab文件

热门文章

  1. PAT Advanced 1033 To Fill or Not to Fill (25) [贪⼼算法]
  2. 第二季第十一天 html5语义化标签 css透明度
  3. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
  4. StringBuiler和StringBuffer的区别
  5. recurrent NN
  6. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:TensorFlow图像处理函数
  7. PCA|factor extraction|CA
  8. video文件转blob
  9. linux 上安装 tomcat
  10. vue中axios的post请求使用form表单格式发送数据