(数论) 约数
比较难,没怎么看懂
//约数: //如果一个数d是n的一个约数,即d能整除n,那么n/d也能整除n: //求所有约数(除法求约数,o(sqrt(n))) #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,x; set<int>yueshu(int p)//利用set去重并自动排序 { set<int>g; for(int i=1;i<=p/i;i++) if(p%i==0) g.insert(i),g.insert(p/i); //这里我用的set,如果用普通数组的话,要特判一下 //在(p%i==0)中加一句if(i!=n/i) g[]=..,不然的话有可能取得数重复 return g; } int main() { cin>>n; while(n--){ cin>>x; auto res=yueshu(x); for(auto t:res) cout<<t<<" "; cout<<endl; } return 0; }
//约数个数(基于算术基本定理):https://blog.csdn.net/m0_61855605/article/details/124003504?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BA%A6%E6%95%B0%E4%B8%AA%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124003504.nonecase&spm=1018.2226.3001.4187 //约数之和(筛法)(o(logn)) //1是所有数的约数,2是所有2的倍数的约数,依次类推,所以1-n中 //总共约数的个数和总共倍数的个数是相同的,因为a是b的约数,b就是a的倍数 //那么1就有n个倍数,2有n/2个倍数,1+n/2+n/3+...=n*logn; //约数个数: #include<bits/stdc++.h> using namespace std; const int mod=1e9+7; int n,x; int main() { cin>>n; unordered_map<int,int>hash; while(n--){ cin>>x; for(int i=2;i<=x/i;i++){ while(x%i==0){ x/=i; hash[i]++; } } if(x>1) hash[x]++,cout<<x<<endl; } // for(auto t:hash) cout<<t.first<<" "<<t.second<<endl; long long res=1; for(auto t:hash) res=res*(t.second+1)%mod; cout<<res; return 0; }
//求一个数的约数个数:https://www.luogu.com.cn/problem/P1403(筛法) #include<bits/stdc++.h> using namespace std; const int N=1e6+10; int f[N],res,n; int main() { cin>>n; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j+=i) f[j]++; res+=f[i]; } cout<<res; return 0; }
//欧几里得算法(求最大公约数): //如果d能整除a,b,那d就能整除(a*n+b*m); //a和b的最大公约数等于b和a%b的最大公约数 #include<bits/stdc++.h> using namespace std; int n; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { cin>>n; while(n--){ int x,y; cin>>x>>y; cout<<gcd(x,y)<<endl; //stl函数直接求: cout<<__gcd(x,y)<<endl; } }

浙公网安备 33010602011771号