首页 > 其他分享 >AtCoder Beginner Contest 290(D,E)

AtCoder Beginner Contest 290(D,E)

时间:2023-05-29 21:12:12浏览次数:55  
标签:AtCoder gcd Beginner int 位置 long include 290 define

AtCoder Beginner Contest 290(D,E)

D (思维,数学)

D

这个题的大意就是我们需要标记\(n\)个位置,他是这样标记的,一开始有一个初始值为\(0\)的\(x\),第一个标记的是\(0\)位置,然后下一步,我们把\(x\)变成\((x+d)mod n\),如果这个位置没有被标记,否则把\(x\)变成\((x+1) mod n\),这个是没有被标记的,那么标记这个,然后再一次进行加\(d\)进行标记,直到所有的位置都被标记,问第\(k\)个被标记的位置是哪一个

我不知道怎么说,感觉有点想找规律,我在自己出了几组数据后面发现了一点点的规律,但是还有一个很重要的点不知道

对于这一个题

它一定有一个循环,不管\(k\)是大还是小

我们可以把一个长度为\(n\)的位置分成\(\frac{n}{gcd}\)段(\(gcd\)是\(n\)和\(d\)段)

假如有三段

第一步在第一段的第一个位置,第二步,在第二段的第一个位置,第三步在第三段的第一个,那么第四步我们又会回答第一段的第一个位置,但是这个位置已经被标记,所以,来到第一段的第二个位置,后面的五六步分别在第二段和第三段的第二个位置

所以,我们可以首先求出这个\(n\)可以被\(d\)分成多少段,\(\frac{n}{gcd}\)

然后我们判断这一个\(k\)在第几段,就可以知道位置的一部分,我们知道第一段里面有\(0\),第二段里面是\(0+\frac{n}{gcd}\),他们相邻之间的距离均为\(\frac{n}{gcd}\),所以,同一段的位置对\(\frac{n}{gcd}\)取余是一样的,然后我们又观察到第一段取余为\(0\),后面依次递增。

可以由\((k-1)\times d mod \frac{n}{gcd}\),得到

但是我们发现这只是大致知道它在那一段,而不知道它经历了多少次循环(第一次是在原来的位置,后面出现了重复的位置,会依次往后面走)

那我们可以判断它进行了所少次循环,可以直接除\(\frac{n}{gcd}\)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=2e5+10;
const int mod=1e9+7;
int n,d,k;
void solve()
{
    cin>>n>>d>>k;
    k--;
    int gcd=__gcd(n,d);
    n/=gcd;
    int cnt=k%n;
    int add=k/n;
    n=n*gcd;
    int ans=(cnt*d)%n+add;
    cout<<ans<<"\n";
    return ;
}
signed main ()
{
    int t=1;
     cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

E(思维)

E

题意大意给出一个数组,问我们如果任意选择一对\(l,r\),要把这个一段变成回文的话,需要最少改变多少个数字

问对于任意组合的\(l,r\)的最少的和

我看到了一个很简单的解法

由于这是一个回文,这个回文如果再在这个回文的基础上往左右两边添加,那么对于最新的\(l,r\)所需的操作对于这一个端点位置,如果需要改变就一定要改变,但是对于和端点位置所在的一个回文串,他们的变化就是上一次更新的操作数

所以我们只需要从中间往两边遍历,然后每一次我们只需要加上这一个位置需要改变的操作,但是每一次求出的操作数可能会被后面用到

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=2e5+10;
const int mod=1e9+7;
int n,cnt[maxn],a[maxn];
void solve()
{
    cin>>n;
    int sum=0;
    int ans=0;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int cur=0;
    for (int i=(n+1)/2;i>=1;i--)
    {
        int l=i,r=n-l+1;
        sum+=cur-cnt[a[l]];
        cnt[a[l]]++;
        cur++;
        if(l!=r)
        {
            sum+=cur-cnt[a[r]];+
            cnt[a[r]]++;
            cur++;
        }
        ans+=sum;
    }
    cout<<ans<<"\n";
    return ;
}
signed main ()
{
   int t=1;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:AtCoder,gcd,Beginner,int,位置,long,include,290,define
From: https://www.cnblogs.com/righting/p/17441665.html

相关文章

  • AtCoder Regular Contest 161 E Not Dyed by Majority (Cubic Graph)
    洛谷传送门AtCoder传送门给构造题提供了一种新的思路。如果答案占总方案数的比较大,可以考虑随机化。例如本题,考虑随机化,难点变成判断一个方案是否可行。考虑2-SAT,如果一个点是\(\text{B}\),那么对于这个点的边,有一条边的另一个端点是\(\text{W}\),那么其他两个都是\(\text{......
  • AtCoder Beginner Contest 303 题解 A - E
    A-SimilarString题目大意忽略0和o的差别以及1和l的差别比较两个字符串。解题思路可以硬求,直接写个超长的if判断一下。可以对两个字符串进行修改,0都换成o,1都换成l,然后直接比较两个字符串。ACCode硬求#include<iostream>#include<algorithm>#include<cstring>#i......
  • AtCoder Beginner Contest 303 G Bags Game
    洛谷传送门AtCoder传送门经典题,考虑区间dp,\(f_{l,r}\)表示只考虑\([l,r]\)区间,先手得分减后手得分最大值。对于第一种操作直接\(f_{l,r}\gets\max(a_l-f_{l+1,r},a_r-f_{l,r-1})\),第二种操作,考虑枚举\([l,r]\)长为\(r-l+1-B\)的子段,即可转移。第三种操......
  • AtCoder Beginner Contest 298(D,F)
    AtCoderBeginnerContest298(D,F)D(思维,模拟,快速幂)D大意是最初有一个数字\(1\),然后进行\(q\)个操作有三种操作\(1\),输入\(1,x\),在原来的数字后面添加一个尾数,例如原本的数是\(12\),输入了\(15\),数字变成了\(125\)\(2\),输入\(2\),把原来的数字第一位数删除,例如原本的数是......
  • AtCoder Beginner Contest 299(E,F)
    AtCoderBeginnerContest299(E,F)E(最短路)E题目大意为有\(n\)个点和\(m\)条边,我们我个这些点匹配颜色(有两种颜色),但是要满足下面的条件必须由一个点的颜色是\(1\)然后给出\(k\)点限制对于\(p_i\)这一个点,离他最近的一个颜色为\(1\)的点的最近距离为\(d_i\)既然知道某个点......
  • Atcoder Grand Contest 062 D - Walk Around Neighborhood
    csy/bxwjz/bx首先将\(a\)排序,如果\(\sum\limits_{i=1}^{n-1}a_i<a_n\)显然就是\(-1\),否则必然有解。先发现一个trivial的事情,就是答案一定位于\([\dfrac{a_n}{2},a_n]\)中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以\((a_n,0),(0,a_n),(-a_n,0),(......
  • AtCoder Regular Contest 139 E Wazir
    洛谷传送门AtCoder传送门好题。这种题一般可以考虑,观察最优解的性质,对于性质计数。发现如果\(n,m\)均为偶数,可以放满。就是类似这样:#.#.#..#.#.##.#.#..#.#.#因此答案就是\(2\)。如果\(n,m\)有一个为偶数,不妨假设\(n\)为偶数。那么最优解形似:#.#...#..##..#......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • AtCoder Beginner Contest 300(E,F)
    AtCoderBeginnerContest300(E,F)E(概率dp)E这个题意大致就是一开始有一个初始数\(x\)为\(1\),然后我们有一个骰子,最后得到的点数概率一样,为\(\frac{1}{6}\),如果这一次得到的点数为\(i\),那么\(x\)会变成\(i\timesx\),问最后得到数\(n\)的概率为多少先感性的分析一波,对于......
  • AtCoder Regular Contest 146 D >=<
    洛谷传送门AtCoder传送门考虑直接增量构造。把条件拆成形如\(a_u\gex\)时\(a_v\gets\max(a_v,y)\),连边,跑类似一个spfa的东西,就行了。这样一定能构造出一组和最小的解。code//Problem:D->=<//Contest:AtCoder-AtCoderRegularContest146//URL:http......