最小公倍数(数学)
其实也没什么。。就是用到了按位取模和最后对整个数取模的答案是一样的结论。但是蒟蒻我想的太复杂了,甚至还写了高精度。。。。
放上丑陋无比的代码。。。
#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;
}