最近看了一些以前自己记录的关于数字的处理,发现有许多自己都已经忘记了。果然要巩固学习才会有进步,菜是最大的原罪,
number1:给定n,求1/x + 1/y = 1/n (x<=y)的解数。
这个题目 主要实行了唯一分解定理就不证明了,看百度吧,
这就是其功能,这里写一个例子吧,:
题目连接链接:https://www.nowcoder.com/acm/contest/90/F
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const ll maxn=1e7+10;
int n,t;
int a[100];
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n;
memset(a,0,sizeof(a));
int p=0;
for(int i=2;i*i<=n;i++){
if(n%i)continue;
while(n%i==0){
a[p]++;
n/=i;
}
p++;
}//坑点
if(n!=1)a[p]++,p++;
for(int i=0;i<p;i++)a[i]*=2;
int ans = 1;
for(int i=0;i<p;i++)ans*=(a[i]+1);
cout<<(ans+1)/2<<endl;
}
return 0;
}
number2:这个是比较基础但非常重要的,素数打表;
bool visit[10100000];
int prime[10000000];
int num=0;
void init_prim(){
memset(visit,true,sizeof(visit));
for(int i=2;i<=n;i++){
if(visit[i]==true){
num++;
prime[num]=i;
}
for(int j=1;((j<=num)&&(i*prime[j]<=n));++j){
visit[i*prime[j]]=false;
if(i%prime[j]==0)break;
}
}
}
number3:丑数(丑数:把只包含因子2,3,5的数称为丑数(Ugly Number))
题目 :求按从小到大的顺序的第N个丑数。习惯将1作为第一个丑数。
const int a[3]={2,3,5};
int n;
int main(){
priority_queue<ll,vector<ll>,greater<ll> >pq;
set<ll>s;//定义集合,排重
pq.push(1);//进入队列
s.insert(1); //插入集合
cin>>n;
for(int i=1;;i++){
ll x=pq.top();//获取到队列第一个元素
pq.pop();
if(i==n){
cout<<x<<endl;
break;
}
for(int j=0;j<3;j++){
ll x2 = x*a[j];
if(!s.count(x2)){
s.insert(x2);
pq.push(x2);
}
}
}
return 0;
}
number4:最大公约数和最小公倍数:
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int lcm(int x int y){
return x*y/(gcd(x,y));
}
number5:快速幂取模:
ll Mode(ll a,ll b,ll mode){
ll sum=1;
whiel(b){
if(b&1){
sum=(sum*a)%mode;
b--;
}
b/=2;
a=a*a%mode;
}
return sum;
}