数论基础(POJ2407)
来源:互联网 发布:英制螺丝孔算法 编辑:程序博客网 时间:2024/06/17 21:58
Description
Input
Output
Sample Input
7120
Sample Output
64
这个题拿到后,第一反应是开循环,用镶嵌循环写,但是看到数据的大小1,000,000,000。太大了,因为我们知道,一般计
算机的运算速度大约在10^7-10^8次/s之间开镶嵌循环肯定超时,所以就去discuss里面看了看,有很多大佬说这题要用欧拉公
式,于是我就去网上找了几篇关于欧拉的博客。下面引用一段:
要计算一个正整数n的欧拉函数的方法如下:1. 将n表示成素数的乘积: n = p1 ^ k1 * p2 ^ k2 * ... * pn ^ kn(这里p1, p2, ..., pn是素数)2. PHI(n) = (p1 ^ k1 - p1 ^ (k1 - 1)) * (p2 ^ k2 - p2 ^ (k2 - 1)) * ... *(pn ^ kn - pn ^ (kn - 1)) = Mult { pi ^ ki - pi ^ (ki -1) }
看了许久方才弄明白这个公式,借鉴了一些别人博客里面的欧拉函数,尝试性的写了以下代码
#include <stdio.h>int main(){ long long n; while(scanf("%lld",&n)!=EOF&&n) { long long t=n; for(int i=2;i*i<=n;i++) { if(n%i==0) { t=t/i*(i-1); //相当于一个递推公式其函数原型没变 while(n%i==0) n/=i; //除去这个数中含有的所有的该因子 } } if(n>1) t=t/n*(n-1); //处理特殊情况的数 printf("%d\n",t); } return 0;}
一次AC。但还是得好好理解,这题以后还会来看。
- 数论基础(POJ2407)
- 书架(贪心,POJ2407)
- POJ2407
- poj2407
- poj2407
- poj2407
- poj2407
- 数论基础(POJ2551)
- 数论基础(POJ2262)
- 数论基础(POJ1401)
- poj2407欧拉函数基础题
- 合数(数论基础概念)
- 数论基础讲解(转)
- 数论基础(from -- kuangbin)
- 数论基础
- 数论基础
- 数论 基础
- 数论基础
- C语言编程基础-struct和union
- HDP错误汇总
- spring中context:property-placeholder/元素
- FreeCodeCamp学习--Caesars Cipher
- 动态规划法(三)——最长公共子序列
- 数论基础(POJ2407)
- String学习
- 2017.4.8微软笔试题
- XML之JDOM解析
- Android 高德地图 关于INVALID_USER_KEY和INVALID_USER_SCODE的问题
- Linux基础命令
- 我的web之旅--day01
- github上传文件和编写.md格式文件
- JavaScript中创建对象过程的理解