算法复习——欧拉函数(poj3090)

题目:

Description

A lattice point (xy) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (xy) does not pass through any other lattice point. For example, the point (4, 2) is not visible since the line from the origin passes through (2, 1). The figure below shows the points (xy) with 0 ≤ xy ≤ 5 with lines from the origin to the visible points.

Write a program which, given a value for the size, N, computes the number of visible points (xy) with 0 ≤ xy ≤ N.

Input

The first line of input contains a single integer C (1 ≤ C ≤ 1000) which is the number of datasets that follow.

Each dataset consists of a single line of input containing a single integer N (1 ≤ N ≤ 1000), which is the size.

Output

For each dataset, there is to be one line of output consisting of: the dataset number starting at 1, a single space, the size, a single space and the number of visible points for that size.

Sample Input

4
2
4
5
231

Sample Output

1 2 5
2 4 13
3 5 21
4 231 32549

题解:

欧拉函数模板题。

心得:

感觉欧拉函数稍微考得隐晦点的就是可视点问题了···嗯就这样

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1006;
int phi[N],sum[N],n;
void pre()
{
  for(int i=1;i<N;i++)
    phi[i]=i;
  for(int i=2;i<N;i++)
    if(phi[i]==i)
      for(int j=i;j<N;j+=i)
        phi[j]=phi[j]*(i-1)/i;
  for(int i=2;i<N;i++)
    sum[i]=phi[i]+sum[i-1];
}
int main()
{
  //freopen("a.in","r",stdin);
  pre();
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
    int k;
    scanf("%d",&k);
    cout<<i<<" "<<k<<" "<<sum[k]*2+3<<endl;
  }
  return 0;
}
时间: 2024-10-27 18:44:46

算法复习——欧拉函数(poj3090)的相关文章

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n)(感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数

poj3090欧拉函数求和

E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0

算法模板——单个值欧拉函数

输入N,输出phi(N) 这样的单个值欧拉函数程序一般见于部分数论题,以及有时候求逆元且取模的数不是质数的情况(逆元:A/B=A*Bphi(p)-1 (mod p),一般常见题中p是质数,phi(p)-1=p-2) (Tip:我是来水经验的不解释,不过话说真的好久没写这个了TT) 1 var i:int64; 2 function Eula(x:int64):int64; 3 var res:int64;i:longint; 4 begin 5 res:=x; 6 for i:=2 to tru

算法模板——线性欧拉函数

实现功能:求出1-N的欧拉函数,然后应对若干个询问操作 其实就是个素数判定+欧拉函数性质的二合一 代码如下,我觉得应高不难懂,只要你知道欧拉函数的性质 var i,j,k,l,m,n:longint; a,b:array[0..10000005] of longint; procedure phi; var i,j:longint; begin m:=0;a[1]:=1; for i:=2 to n do begin if a[i]=0 then begin inc(m); b[m]:=i; a

POJ3090(SummerTrainingDay04-M 欧拉函数)

Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7450   Accepted: 4536 Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible fr

poj3090 Visible Lattice Points [欧拉函数]

Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For example

根据要求求除数的数 与 互素和算法 (的品质因数和欧拉函数分解)

Description One day, Qz met an easy problem. But after a 5-hout-long contest in CSU, he became very tired and he wanted to call his girlfriend as soon as possible. As we all know, Qz is a genius in plenty of fields especially in programming. But he d

欧拉函数与欧拉定理

以下内容摘自acdreamer 定理一:设m与n是互素的正整数,那么 定理二:当n为奇数时,有. 因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值. 定理三:设p是素数,a是一个正整数,那么 关于这个定理的证明用到容斥: 由于表示小于与互素数的正整数个数,所以用减去与它不互素的数的个数就行了. 那么小于与不互素数的个数就是p的倍数个数,有个.所以定理得证. 定理四:设为正整数n的素数幂分解,那么 这个定理可以根据定理一和定理三证明,其实用到

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方法的时间复杂度为O(N),随着N的增加,效率依然很慢.这里有个O()的方法:对于一个合数,其必用一个约数(除1外)小于等于其平方根(可用反证法证明),所以我们只需要判断2-之间的数即可. bool is_prime(int num) { const int border = sqrt(num); for