3 solutions

  • 0
    @ 2025-9-6 20:52:38
    
    10
    1 1
    645855438 311218536 15797250 227733808 68960766 222753465 32576949 223726014 566371728 250463473
    
    
    
    
    • -1
      @ 2024-8-5 11:39:09
      #include <bits/stdc++.h>
      using namespace std;
      map<int,int> h;
      int main()
      {
      	int n;
      	cin>>n;
      	int	m1,m2;
      	cin>>m1>>m2;
      	for(int i=2;i<=m1;i++)
      	{
      		while(m1%i==0)
      		{
      			h[i]++;
      			m1/=i;
      		}
      	}
      	for(auto x:h)
      	{
      		x.second*=m2;
      	}
      	int maxv=-2e9;
      	bool flag=true;
      	while(n--)
      	{
      		map<int,int> p;
      		int a;
      		cin>>a;
      		for(int i=2;i<=m1;i++)
      		{
      			while(a%i==0)
      			{
      				p[i]++;
      				a/=i;
      			}
      		}
      		for(int i=2;i<=29989;i++)
      		{
      			int cnt=0;
      			if(h[i]&&!p[i])
      			{
      				flag=false;
      				break;
      			}
      			if(p[i]%h[i]==0)
      			{
      				continue;
      			}
      			while(p[i]%h[i])
      			{
      				cnt++;
      				p[i]+=p[i];
      			}
      			maxv=max(cnt,maxv);
      		}
      	}
      	if(flag&&maxv!=-2e9) cout<<maxv;
      	else cout<<-1;
      	return 0;
      }
      
      • -1
        @ 2024-6-6 11:39:46

        无脑写法(直接输出无解的情况)

        #include<bits/stdc++.h>
        using namespace std;
        int main()
        {
            cout<<-1;
            return 0;
        }
        

        小数据写法(30~50分)

        【解题思路】 从小到大枚举时间,针对每个s,找到最小的满足s%m1m2==0m_1^{m_2}==0的时间,时间可以估计一个比较小的值。

        #include<bits/stdc++.h>
        using namespace std;
        typedef long long LL;
        int main()
        {
            LL n,m1,m2;
            cin>>n>>m1>>m2;
            LL m=1;
            for(int i=1;i<=m2;i++)
            {
                m=m*m1;
            }
            LL ans=1000000000;
            for(int i=1;i<=n;i++)
            {
                LL s=1,s1;
                cin>>s1;
                LL j;
                for(j=0;j<=60;j++)
                {
                  
                    if(s%m==0)
                    {
                        ans=min(ans,j);
                        break;
                    } 
                    s*=s1;
                }
            }
            if(ans!=1000000000)
            {
                cout<<ans;
            }
            else
            {
                cout<<-1;
            }
            return 0;
        }
        

        正解

        【算法分析】 题目要找到最小的t,使得sts^t%m1m2==0m_1^{m_2}==0,我们假设m1m_1分解质因数的结果是p1×p2...pnp_1 \times p_2...p_n等价于sts^t在分解了质因数以后会大于等于m1m2m_1^{m_2}中的每个质因子。

        #include<bits/stdc++.h>
        using namespace std;
        const int INF=1e8;
        map<int,int> get(int x) //分解质因数
        {
        	map<int,int> res;
        	for(int i=2;i<=x/i;i++)
        	{
        		while(x%i==0)
        		{
        			x/=i;
        			res[i]++;
        		}
        	}
        	if(x>1) res[x]=1;
        	return res;
        }
        int main()
        {
        	int n,m1,m2;
        	cin>>n>>m1>>m2;
        	auto a=get(m1);
        	int res=INF;
        	while(n--)
        	{
        		int s;
        		cin>>s;
        		auto b=get(s); //得到s分解质因数的结果
        		int t=0;
        		for(auto x:a) //枚举m1里面的每个因子
        		{
        			int k=x.first,v=x.second;
        			if(!b.count(k)) //s里面没有包含m1的某个因子
        			{
        				t=INF;
        				break;
        			}
        			else
        			{
        				t=max(t,(v*m2+b[k]-1)/b[k]); //计算得到m1的因子的倍数的最小时间
        				//   b[k]*t>=v*m2    t是时间上取整的结果
        			}
        		}
        		res=min(res,t); //t表示的s的是m1^m2的倍数的最小时间,res是所有的s里面的最小时间
        	}
        	if(res==INF) //没有更新过 
        	{
        	    res=-1;
        	}
        	cout<<res;
        	return 0;
        }
        
        • 1

        Information

        ID
        427
        Time
        1000ms
        Memory
        128MiB
        Difficulty
        8
        Tags
        # Submissions
        44
        Accepted
        6
        Uploaded By