2018QBXT刷題遊記(1)
阿新 • • 發佈:2018-12-13
【2018QBXT刷題遊記】
Day1 TEST1
T1
【題目大意】輸入n,求n與的最小公倍數,對1234567890取模
對於 30%的資料, 對於 60%的資料, 對於 100%的資料,
【慌亂分析】這是個什麼鬼數??又是什麼鬼資料範圍???
當我敲出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的倍數“”
由
可知
由於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;
}