zoukankan      html  css  js  c++  java
  • Wannafly Camp 2020 Day 1H 最大公约数

    把每个质因子扒出来乱搞一下

    #include <bits/stdc++.h>
    using namespace std;
    int g[505][505];
    int isp[505];
    struct Biguint {
    	int a[10005], len;
    
    	Biguint() {
    		memset(a, 0, sizeof a);
    		len = 0;
    	}
    
    	void read() {
    		string str;
    		cin >> str;
    		memset(a, 0, sizeof a);
    		len = str.length();
    		for (int i = 0; i < str.size(); i++)
    			a[i] = str[str.length() - i - 1] - '0';
    	}
    
    	void print() {
    		for (int i = len - 1; i >= 0; i--) {
    			cout << a[i];
    		}
    	}
    
    	bool operator < (const Biguint& obj) {
    		const int* b = obj.a;
    		if (this->len == obj.len) {
    			for (int i = 0; i < len; i++)
    				if (a[i] != b[i]) return a[i] < b[i];
    			return false;
    		}
    		else return this->len < obj.len;
    	}
    
    	bool operator > (const Biguint& obj) {
    		const int* b = obj.a;
    		if (this->len == obj.len) {
    			for (int i = 0; i < len; i++)
    				if (a[i] != b[i]) return a[i] > b[i];
    			return false;
    		}
    		else return this->len > obj.len;
    	}
    
    	bool operator != (const Biguint& obj) {
    		return (*this < obj) | (*this > obj);
    	}
    
    	bool operator == (const Biguint& obj) {
    		return !((*this < obj) | (*this > obj));
    	}
    
    	bool operator <= (const Biguint& obj) {
    		return (*this) < obj || (*this) == obj;
    	}
    
    	bool operator >= (const Biguint& obj) {
    		return (*this) > obj || (*this) == obj;
    	}
    
    	Biguint operator += (const Biguint& obj) {
    		const int* b = obj.a;
    		if (obj.len > len) len = obj.len;
    		for (int i = 0; i < len; i++) {
    			a[i] += b[i];
    			if (a[i] >= 10) a[i + 1] += a[i] / 10, a[i] %= 10;
    		}
    		if (a[len]) ++len;
    		while (a[len - 1] >= 10)
    			a[len] += a[len - 1] / 10, a[len - 1] %= 10, ++len;
    		return *this;
    	}
    
    	Biguint operator + (const Biguint& obj) {
    		Biguint ret;
    		ret += *this;
    		ret += obj;
    		return ret;
    	}
    
    	Biguint operator -= (const Biguint& obj) {
    		const int* b = obj.a;
    		for (int i = 0; i < len; i++) {
    			a[i] -= b[i];
    			if (a[i] < 0) a[i + 1]--, a[i] += 10;
    		}
    		while (a[len - 1] == 0 && len > 0) --len;
    		return *this;
    	}
    
    	Biguint operator -(const Biguint& obj) {
    		Biguint ret;
    		ret += *this;
    		ret -= obj;
    		return ret;
    	}
    
    	Biguint operator *= (int b) {
    		for (int i = 0; i < len; i++)
    			a[i] *= b;
    		for (int i = 0; i < len; i++)
    			a[i + 1] += a[i] / 10, a[i] %= 10;
    		++len;
    		while (a[len - 1] >= 10)
    			a[len] += a[len - 1] / 10, a[len - 1] %= 10, ++len;
    		while (a[len - 1] == 0 && len > 0) --len;
    		return *this;
    	}
    
    	Biguint operator * (int b) {
    		Biguint ret;
    		ret = *this;
    		ret *= b;
    		return ret;
    	}
    
    	Biguint operator * (const Biguint& obj) {
    		const int* b = obj.a;
    		Biguint ret;
    		for (int i = 0; i < len; i++)
    			for (int j = 0; j < obj.len; j++)
    				ret.a[i + j] += a[i] * b[j];
    		for (int i = 0; i < len + obj.len; i++)
    			ret.a[i + 1] += ret.a[i] / 10, ret.a[i] %= 10;
    		ret.len = len + obj.len;
    		++ret.len;
    		while (ret.a[ret.len - 1])
    			ret.a[ret.len] += ret.a[ret.len - 1] / 10, ret.a[ret.len - 1] %= 10, ++ret.len;
    		while (ret.a[ret.len - 1] == 0 && ret.len > 0) --ret.len;
    		return ret;
    	}
    
    };
    ostream& operator << (ostream& os, Biguint num)
    {
    	//cout << "[" << num.len << "]";
    	for (int i = num.len - 1; i >= 0; --i)
    		os << num.a[i];
    	if (num.len == 0) os << "0";
    	return os;
    }
    
    istream& operator >> (istream& is, Biguint& num)
    {
    	string str;
    	is >> str;
    	memset(num.a, 0, sizeof num.a);
    	num.len = str.length();
    	for (int i = 0; i < str.length(); i++)
    		num.a[i] = str[str.length() - i - 1] - '0';
    	return is;
    }
    Biguint bigu(int t) {
        Biguint b;
        b.len = 1;
        b.a[0] = 1;
        b*=t;
        return b;
    }
    int main() {
        isp[1]=0;
        for(int i=2;i<=500;i++) {
            int flag=1;
            for(int j=2;j<i;j++)
                if(i%j==0) flag=0;
            isp[i]=flag;
        }
        for(int i=1;i<=500;i++) {
            int t=i;
            for(int j=2;j<=i;j++)
                while(isp[j]&&t%j==0)
                    g[i][j]++,t/=j;
        }
        int T;
        cin>>T;
        while(T--) {
            int n,k;
            cin>>n>>k;
            int tk=k;
            int myFac[505]={};
            for(int i=2;i<=k;i++) {
                while(isp[i]&&tk%i==0)
                    myFac[i]++,tk/=i;
            }
            int aFac[505]={};
            for(int i=k*2;i<=n;i+=k) {
                for(int j=2;j<=i;j++)
                    if(g[i][j]>myFac[j]) aFac[j]=1;
            }
            for(int i=2;i<=n;i++) {
                myFac[i]+=aFac[i];
                //cout<<myFac[i]<<" ";
            }
            //cout<<endl;
            Biguint ans = bigu(1);
            for(int i=2;i<=n;i++) {
                while(myFac[i]) {
                    Biguint x = bigu(i);
                    ans=ans*x;
                    myFac[i]--;
                }
            }
            cout<<ans<<endl;
        }
    }
    
  • 相关阅读:
    0094-leetcode算法实现之二叉树中序遍历-binary-tree-inorder-traversal-python&golang实现
    0144-leetcode算法实现之二叉树的前序遍历-binary-tree-preorder-traversal-python&golang实现
    0347-leetcode算法实现之前K个高频元素-top-k-frequent-elements-python&golang实现
    0239-leetcode算法实现之滑动窗口最大值-sliding-window-maximum-python&golang实现
    0150-leetcode算法实现之逆波兰表达式-evaluate-reverse-polish-notation-python&golang实现
    1047-leetcode算法实现之删除字符串的所有相邻的重复字符-remove-all-adjacent-duplicates-in-string-python&golang实现
    pstack 追踪进程-转
    0225-leetcode算法实现之用队列实现栈-implement-stack-using-queues-python&golang实现
    0020-leetcode算法实现之有效括号-valid-parentheses-python&golang实现
    0232-leetcode算法实现-用栈实现队列-implement-queue-using-stacks-python&golang实现
  • 原文地址:https://www.cnblogs.com/mollnn/p/12254283.html
Copyright © 2011-2022 走看看