1 条题解

  • 0
    @ 2025-8-24 22:57:03

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Genshin_ZFYX
    .

    搬运于2025-08-24 22:57:03,当前版本为作者最后更新于2024-04-09 20:57:05,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言

    这题代码操作并不难,但思维难度是有的,连我也去评论区看了看别人的思路才做出来的。

    解题思路

    首先,我们可以先证明一个很重要的结论:

    假设有一个序列 aa

    2,3,4,52,3,4,5

    我们把除了 a1a_1 以外的所有数都乘 22

    2,6,8,102,6,8,10

    我们再拿原来的 aa,把这里 a1a_1 除以 22

    1,3,4,51,3,4,5

    我们会发现,虽然值不同,但是每个数之间的倍数关系是不变的!这就跟老师给全班同学发了了一台电脑(怎么可能),唯独你没有被发到。这个例子和老师到你家去抢了一台电脑一样,每名同学间电脑的数量差一样的(其实就是等式的性质,只不过有多个数)。

    所以说,把一个长度为 nn 的序列中 n1n-1 个数的值乘一个相同的数,等于拿剩下的那个数除以这个相同的数。

    我们不难想到,当所有 aia_i 的值相同时,我们可以把 nn 个数都乘一遍,而且只用操作一次。

    aia_i 的值并不完全相同时,我们进行 n1n-1 次操作,每次操作把第 ii 个数 aia_i 除以它自己,就可以最后变成一个每项都为 11 的序列了。

    结论:aia_i 相同时,答案为 nn ,否则为 n1n-1

    AC 代码:

    #include<bits/stdc++.h>
    using namespace std;
    //#define int long long
    #define I return
    #define love 0
    #define FIRESTARS ;
    int a[10005];
    signed main()
    {
        cin.tie(0)->sync_with_stdio(0);
        int t,n,f=1;cin>>t;
        while(t--)
        {
        	f=1;
        	cin>>n;
        	for(int i=1;i<=n;i++)cin>>a[i];
        	for(int i=2;i<=n;i++)
        	if(a[i]!=a[i-1])
        	{
        		f=0;
    			break;
    		}
    		cout<<(f?n:n-1)<<'\n';
    	}
    	I love FIRESTARS
    }
    
    
    • 1

    信息

    ID
    9985
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者