最小公倍数(数学)


其实也没什么。。就是用到了按位取模和最后对整个数取模的答案是一样的结论。但是蒟蒻我想的太复杂了,甚至还写了高精度。。。。
放上丑陋无比的代码。。。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
#define MAXN 246913578
#define mod 1234567890
using namespace std;
string s;
map<int,int>m;
int a[200010],b[200010],c[400010];
long long cur,cur_ans;
long long getsum()
{
	long long sum=0;
	for(int i=0;i<s.length();i++)
		sum=sum*10+(s[i]-'0');
	return sum;
}
void solve(int k)
{
	int sum=0;
	for(int i=0;i<s.length();i++) 	
		sum=(sum*10+(s[i]-'0'))%k;
	if(sum==0) m[k]++;
	if(sum==0&&k==9) m[3]++;
}
void mul(string n1,string n2)
{
    int lena=n1.length(),lenc=0,x=0;
    int lenb=n2.length();
    //cout<<"lena="<<lena<<" lenb="<<lenb<<endl;
    //cout<<"n1="<<n1<<" n2="<<n2<<endl;
    for(int i=0;i<lena;i++)     a[lena-1-i]=n1[i]-'0';
    for(int i=0;i<lenb;i++)     b[i]=n2[i]-'0';
    for(int i=0;i<lena;i++)
    {
        x=0;
        for(int k=0;k<lenb;k++)
        {
            c[i+k]+=a[i]*b[k]+x;
            x=c[i+k]/10;
            c[i+k]%=10;
        }
        c[lenb+i]=x;
    }
    lenc=lena+lenb;
    while((c[lenc]==0)&&(lenc>0))  lenc--;
    for(int i=lenc;i>=0;i--) cur_ans=(cur_ans*10+c[i])%mod;//cout<<c[i];
    cout<<cur_ans<<endl;
    // for(int i=lenc;i>=0;i--) cout<<c[i];
    //cout<<endl;
    return;
}
int main()
{
	freopen("lcm.in","r",stdin);
	freopen("lcm.out","w",stdout);
	cin>>s;
	long long a=MAXN;
	if(s.length()<=9) 
	{
		cur=getsum();
		if(MAXN%cur==0)
		{
			cout<<MAXN<<endl;
			return 0;
		}
	}
	solve(2);
	solve(3);
	solve(9);
	solve(3607);
	solve(3803);
	if(m[2]) a/=2;
	if(m[3]) a/=3,m[3]--;
	if(m[3]) a/=3;
	if(m[3607]) a/=3607;
	if(m[3803]) a/=3803;
	//cout<<"a="<<a<<endl;
	string aa;
	while(a)
	{
		aa+=(char)(a%10+'0');
		a/=10;
	}
	//cout<<"aa="<<aa<<endl;
	mul(s,aa);
	return 0;
}
posted @ 2018-10-07 10:07  风浔凌  阅读(561)  评论(0编辑  收藏  举报