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 }
二 最大公约数
三 互质与欧拉函数
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; } } }
201. 可见的点 https://www.acwing.com/problem/content/203/
在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。
例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1)。
部分可见点与原点的连线如下图所示:
编写一个程序,计算给定整数N的情况下,满足0≤x,y≤N0≤x,y≤N的可见点(x,y)的数量(可见点不包括原点)。
输入格式
第一行包含整数C,表示共有C组测试数据。
每组测试数据占一行,包含一个整数N。
输出格式
每组测试数据的输出占据一行。
应包括:测试数据的编号(从1开始),该组测试数据对应的N以及可见点的数量。
同行数据之间用空格隔开。
数据范围
1≤N,C≤10001≤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; }