1. 程式人生 > >2018QBXT刷題遊記(1)

2018QBXT刷題遊記(1)

【2018QBXT刷題遊記】

Day1 TEST1

T1

【題目大意】輸入n,求n與246913578246913578的最小公倍數,對1234567890取模

對於 30%的資料, n<=109n<=10^{9} 對於 60%的資料,n<=1018n<=10^{18} 對於 100%的資料,n<=10100000n<=10^{100000}

【慌亂分析】這是個什麼鬼數??又是什麼鬼資料範圍??? 當我敲出const int qaq=246913578;時,好像突然意識到了什麼?1到9各出現了一次啊,一定有蹊蹺!於是求了一下它的因數: 在這裡插入圖片描述

妙啊!123456789! 也就是說它是1234567890的1/5,所以只用求輸入的n%5餘數就好啦(考場想法,70分w)

於是得到了70分的…好成績…(QAQ) 下面是冗長醜陋的程式碼

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
#define ll long long
ll qwq[35],qaq[35],f1[35],f2[35];
void init(){
	qwq[1]=2;qwq[2]=3;qwq[3]=6;qwq[4]=9;qwq[5]=18;
	qwq[6]=3607;qwq[7]=3803;qwq[8]=7214;qwq[9]=7606;
	qwq[10]=10821;qwq[11]=11409;qwq[12]=21642;
	qwq[13]=22818;qwq[14]=32463;
	qwq[15]=34227;qwq[16]=64926;qwq[17]=68454;
	qwq[18]=13717421;qwq[19]=27434842;
	qwq[20]=41152263;qwq[21]=82304526;
	qwq[22]=123456789;qwq[23]=246913578;
	for(int i=1;i<=22;i++)qaq[i]=qwq[23-i];
	qaq[23]=1;
}
ll n;
int emm=246913578;
#define MOD 12345678
int main(){
	freopen("lcm.in","r",stdin);
	freopen("lcm.out","w",stdout);
	init();
	cin>>n;
	if(n<emm){
		ll tmp=0;ll q;
		for(int i=22;i>=1;i--){
			if(n%qwq[i]==0){
				tmp=n/qwq[i];
				q=qwq[i];
				break;
			}
		}
		if(tmp){
			int f=tmp%5;
			cout<<emm*f<<endl;
			return 0;
		}
		else{
			int f=n%5;
			cout<<emm*f<<endl;
			return 0;
		}
	}
	if(n==emm){
		cout<<emm<<endl;
			return 0;
	}
	if(n>emm){
		ll tmp=0;ll q;
		for(int i=22;i>=1;i--){
			if(n%qwq[i]==0){
				tmp=n/qwq[i];
				q=qwq[i];
				break;
			}
		}
		if(tmp){
			int f=tmp%5;
			cout<<emm*f<<endl;
			return 0;
		}
		else{
			int f=n%5;
			cout<<emm*f<<endl;
			return 0;
		}
	}	
	return 0;
}

當看到解析的時候我是憂傷的… 啊…要是推一推公式就100了…

輸入高精度數a與普通整數b求lcm,對c取模,c是b的倍數“”

lcm(x,y)=xygcd(x,y)lcm(x, y) = \frac{xy}{gcd(x,y)}

gcd(x,y)=gcd(xy,y)gcd(x, y)=gcd(x − y, y)

可知 lcm(a,b)=abgcd(amod&ThinSpace;&ThinSpace;b,b)lcm(a, b) =\frac{ab}{gcd(a\mod b,\ b)}

gcd(amodb,b)ab

由於c是b的倍數 lcm(a,b)=abgcd(amod&ThinSpace;&ThinSpace;c,b)lcm(a,b)=\frac{ab}{gcd(a\mod c,\ b)}

$lcm(a,b)\equiv \frac {(a\ mod\ c)b}{gcd((a\mod c),b)}(mod \ c) $

所以可以邊輸入邊取模,不涉及高精問題了!

修改版程式碼

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int MOD=1234567890;
const int qaq=246913578;
ll gcd(ll x,ll y){
	if(y==0)return x;
	else return gcd(y,x%y);
} 
int main(){
	char t;
	t=getchar();
	ll n;
	while(t>='0'&&t<='9'){
		n=(n*10+t-'0')%MOD;//邊讀入邊取模,學到了
		t=getchar();
	}
	n=n/gcd(n,246913578);
	n=n*qaq%MOD;
	cout<<n<<endl;
	return 0;
}