数学的分析
二相関原理
https://m.baike.so.com/doc/3567228-3751425.html
3つの実践演習
最大約数問題
問題の説明: 正の整数 x の約数は、x を等分できる正の整数です。正の整数 x の約数は div(x) として記録されます。たとえば、1、2、3、および 10 はすべて正の整数 10 の約数であり、div(10)=4 です。a と b が 2 つの正の整数 (a<=b) であると仮定し、a と b の間で最大の除数を持つ数 x を見つけます。
以下は、C言語での実装を示しています
1. 素数を生成する関数
void primes(){
bool get [MAXP+1];
for(int i=2;i<=MAXP;i++)
get[i]=ture;
for(i=2;i<=MAXP;i++)
if(get[i]){
int j=i+1;
while(j<=MAXP){
get[j]=false;
j+=i;
}
}
for(int ii=2,j=0;ii<=MAXP;ii++)
if(get[ii]){
prim[++j]=ii;
}
2. 約数が最も多い関数を探す
void search(int from,int tot,int num,int low,int up){
if(num>=1)
if((tot>max)||((tot==max)&&(num<numb))){
max=tot;
numb=num;
}
if((low==up)&&(low>num))
search(from,tot*2,num*low,1,1);
for(int i=from;i<=PCOUNT;i++){
if(prim[i]>up)
return;
else{
int j=prim[i],x=low1,y=up,n=num,t=tot,m=1;
while(ture){
m++;
t+=tot;
x/=j;
y/=j;
if(x==y)
break;
n*=j;
search(i+1,t,n,x+1,y);}
}
m=1<<m;
if(tot<max/m)
return;
}
}
3. 主な機能
int main(){
primes();
cin>>l>>u;
if((l==1)&&(u==1)){
max=1;
numb=1;
}
else{
max=2;
numb=1;
search(1,1,1,l,u);
}
cout<<max<<end1;
return 0;
}