zoukankan      html  css  js  c++  java
  • 2018QBXT刷题游记(1)

    【2018QBXT刷题游记】

    Day1 TEST1

    T1

    【题目大意】输入n,求n与(246913578)的最小公倍数,对1234567890取模

    对于 30%的数据, (n<=10^{9})
    对于 60%的数据,(n<=10^{18})
    对于 100%的数据,(n<=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) = frac{xy}{gcd(x,y)})

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

    可知 (lcm(a, b) =frac{ab}{gcd(amod b, b)})

    由于c是b的倍数 (lcm(a,b)=frac{ab}{gcd(amod c, b)})

    $lcm(a,b)equiv frac {(a mod c)b}{gcd((amod 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;
    }
    
  • 相关阅读:
    C# 获取类似java gettime() 的时间格式
    LUbuntu电脑棒安装指南
    Visual Studio Gallery
    SQL SERVER 分页存储过程
    asp.mvc获取checkbox、radio、select的值
    C#面向对象的一些笔记
    Javascript预解析、作用域、作用域链
    解决ajax请求cors跨域问题
    Asp.Net操作WebServices
    2019年科技趋势前10位
  • 原文地址:https://www.cnblogs.com/erutsiom/p/9901688.html
Copyright © 2011-2022 走看看