约数

 

    4 反素数

       198. 反素数 https://www.acwing.com/problem/content/description/200/

        

      确定前10个质数的指数,指数连续且单调递减 总乘积不超过n ,同时记录约数的个数

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 int p[10] = {2,3,5,7,11,13,17,19,23,29};
 5 int n,ans,myyues = 1;
 6 void dfs(int index,int yueshu,int num){//指数的位置 约数个数 数字
 7     if(index > 10) return;
 8     if(yueshu > myyues ||(yueshu == myyues && num < ans))
 9         ans = num,myyues = yueshu;
10     for(int i = 1; i <= 30; i++){
11         if(p[index] * num > n) break;
12         //一层一层走的
13         dfs(index + 1,yueshu*(i + 1),num *= p[index]);
14     }
15 }
16 signed main(){
17     ios::sync_with_stdio(0);
18     cin >> n;
19     dfs(0,1,1);
20     cout << ans;
21     return 0;
22 }
View Code

二  最大公约数

互质与欧拉函数

    

void euler(){
    m = 0;
    memset(v,0, sizeof(v));
    for(int i = 2; i <= n; i++){
        if(!v[i]) v[i] = 1,prime[++m] = i,phi[i] = i - 1;
        for(int j = 1; j <= m && i * prime[j] <= n; j++){
            v[i * prime[j]] = 1;
            phi[i * prime[j]] = phi[i] *(i % prime[j] ? prime[j] - 1 : prime[j]);
            if(i % prime[j] == 0) break;
        }
    }
}
View Code

   201. 可见的点 https://www.acwing.com/problem/content/203/

在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。

例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1)。

部分可见点与原点的连线如下图所示:

3090_1.png

编写一个程序,计算给定整数N的情况下,满足0xyN0≤x,y≤N的可见点(x,y)的数量(可见点不包括原点)。

输入格式

第一行包含整数C,表示共有C组测试数据。

每组测试数据占一行,包含一个整数N。

输出格式

每组测试数据的输出占据一行。

应包括:测试数据的编号(从1开始),该组测试数据对应的N以及可见点的数量。

同行数据之间用空格隔开。

数据范围

1N,C10001≤N,C≤1000

输入样例:

4
2
4
5
231

输出样例:

1 2 5
2 4 13
3 5 21
4 231 32549
#include <bits/stdc++.h>
using namespace std;
#define int long long
int v[1010],phi[1010],prime[1010];
int n,m,t,ans;
void euler(){
    m = 0;
    memset(v,0, sizeof(v));
    for(int i = 2; i <= n; i++){
        if(!v[i]) v[i] = 1,prime[++m] = i,phi[i] = i - 1;
        for(int j = 1; j <= m && i * prime[j] <= n; j++){
            v[i * prime[j]] = 1;
            phi[i * prime[j]] = phi[i] *(i % prime[j] ? prime[j] - 1 : prime[j]);
            if(i % prime[j] == 0) break;
        }
    }
}
signed main(){
    //freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    cin >> t;
    for(int i = 1; i <= t; i++) {
        cin >> n;
        euler();
        ans = 0;
        for (int j = 2; j <= n; j++) ans += (2 * phi[j]);

        cout << i << " " << n << " " << ans + 3  << endl;
    }
    return 0;
}
View Code
 

  

  

原文地址:https://www.cnblogs.com/xcfxcf/p/12317020.html