• Codeforces Round #777 (Div. 2))D,E


    Codeforces Round #777 (Div. 2)D,E

    D. Madoka and the Best School in Russia

    • 若一个数字能被d整除,那么其就是一个good数
    • 若一个数字能够被称为上是一个beautiful数,第一它本身是一个good数,其次它不能够被分解为两个good数的乘积,也就是说它可以包含一个d和其他因子。
    • 若一个数字能够以至少两种方式被分解为一个或者多个beautiful数的乘积的话,那么则输出YES,否则输出NO。
    • 分类讨论
      • 如果x分解出的d的个数小于2的话,那么直接输出NO。
      • 如果x分解出的d的个数等于2的话,如果\(x/d^2\)是质数,输出NO,否则输出YES。
      • 如果x分解出的d的个数大于等于3的话,如果\(x/d^{cnt}\)是一个合数的话,那么直接输出YES,否则尝试将d进行内部分解,使其分配到其他的d上。
        • 特判 样例 128 4,却输出NO,这个是因为\(128=4\times 4\times 4\times 2=4\times 4\times 8\),这时的4无法进行分解,否则将破坏beautiful数的定义。
    #include <bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define MAX 1000005
    #define MOD 1000000007
    using namespace std;
    const int N = 3E5+5,M = 6E5+10;
    int x,d;
    bool isprime(int k)
    {
    	int p = sqrt(k); 
    	for(int i=2;i<=p;i++)
    	    if(k%i==0) return false;
    	return true;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        int t;
        cin>>t;
        while(t--)
        {
        	cin>>x>>d;
    	    int cnt = 0;
    	    for(;x%d==0;x/=d) cnt++;
    	    if(cnt<=1) cout<<"NO"<<endl;
    	    else if(cnt==2)
    		{
    			if(isprime(x)) cout<<"NO"<<endl;
    			else cout<<"YES"<<endl;
    		} 
    		else if(cnt>=3)
    		{
                if(!isprime(x)) cout<<"YES"<<endl;
                else if(!isprime(d))
                {
                	if(d==x*x&&cnt==3)
                	   cout<<"NO"<<endl;
                	else cout<<"YES"<<endl;
    			}else cout<<"NO"<<endl;
    		}
    	}
        return 0;
    }
    

    E. Madoka and the Sixth-graders

    • 题意:

    • 有n个位置,规定坐在位置i的人在下一轮会到对应的位置进行坐下,若一个位置被多个人挤占,则保留编号小的,而其他编号的人直接进行淘汰,并从编号为n+1,...中按顺序进行补充。

    • 由于每一轮的每一个位置转移的方向是固定的,所以空出的数量k也是固定的,于是可以拿出最后一轮中最大的数字减去n,来除去k,得到具体移动了几轮。

      而我们可以通过倍增的思想快速得到第一轮任意一个位置在第n轮的位置。

    • 空出的位置之所以会空出来,是因为这个位置上没有任何人移动到这个位置,同时这个位置上的人移动到了其他的位置,而每一轮这些位置上都会补充带有更大的数的人(相当于是炮灰),

    image

    #include <bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define MAX 1000005
    #define MOD 1000000007
    #define de(x) cout<<"de : "<<x<<endl;
    using namespace std;
    const int N = 1E5+5,M = 6E5+10;
    int n,m,go[32][N],ans[N],fin[N],sta[N],end[N],num;
    vector<int> ori[N],beat[N];
    bool vis[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin>>n;
        set<int> st;
        repd(i,1,n) cin>>go[0][i],st.insert(go[0][i]);
        repd(i,1,n) cin>>fin[i];
        repd(i,1,30) repd(j,1,n) go[i][j] = go[i-1][ go[i-1][j] ];
        int maxn = *max_element(fin+1,fin+n+1);
        num = (maxn-n)/(n-st.size());
        repd(i,1,n)
        {
        	int pos = i;
        	repd(j,0,30) if( num&(1<<j) ) pos = go[j][pos];
        	ori[pos].push_back(i);
    	}
    	repd(i,1,n)
    	{
    		if(fin[i]<=n)
    	    {
    	        sta[ ori[i][0] ] = fin[i];
    			vis[ fin[i] ] = 1;
    			rep(j,1,ori[i].size())beat[ fin[i] ].push_back(ori[i][j]);  
    		}
    	}
    	set<int> open_st;
    	repd(i,1,n)
    	{
    	
    		if(vis[i])
    		   for(auto x:beat[i])
    		  	   	open_st.insert(x); 
    		else
    		{
    			sta[ *open_st.begin() ] = i;
    			open_st.erase(open_st.begin()); 
    		}
    	}
    	repd(i,1,n)
    	    cout<<sta[i]<<" ";
        return 0;
    }
    
    
  • 相关阅读:
    ES6 数值
    ES6 字符串
    ES6 Reflect 与 Proxy
    ES6 Map 与 Set
    es6 Symbol
    新兴的API(fileReader、geolocation、web计时、web worker)
    浏览器数据库 IndexedDB 入门教程
    离线应用与客户端存储(cookie storage indexedDB)
    javascript高级技巧篇(作用域安全、防篡改、惰性载入、节流、自定义事件,拖放)
    ajax与comet
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15997808.html
Copyright © 2020-2023  润新知