Cod sursa(job #2779601)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 4 octombrie 2021 12:53:35
Problema Robotei Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("robotei.in");
ofstream fout("robotei.out");
const int NMAX = 1005;
int n,m,x,y,modx,mody,offsetx,offsety;
int a[NMAX],b[NMAX],afis[NMAX],ver[NMAX][NMAX];
void dfs(int x,int y){
    ver[x][y]=-1;
    int x2=(x*x+offsetx)%modx;
    int y2=(y*y+offsety)%mody;
    if(ver[x2][y2]==0) dfs(x2,y2);
    if(ver[x2][y2]!=-1)
        ver[x][y]=ver[x2][y2]+1;
}
int main()
{
    fin >> n >> m >> x >> y >> modx >> mody >> offsetx >> offsety;
    ver[x][y]=1;
    for(int i=0;i<n;i++){
        a[(i*i+offsetx)%modx]++;
        b[(i*i+offsety)%mody]++;
    }
    for(int i=0;i<modx;i++){
        for(int j=0;j<mody;j++){
            if(ver[i][j]==0)
                dfs(i,j);
        }
    }
    int ciclu=ver[(x*x+offsetx)%modx][(y*y+offsety)%mody];
    for(int i=0;i<modx;i++){
        for(int j=0;j<mody;j++){
            int nr=ver[i][j];
            if(0<nr and nr<=m){
                if(ciclu>0) afis[1+(m-nr)/ciclu]+=a[i]*b[j];
                else        afis[1]+=a[i]*b[j];
            } else          afis[0]+=a[i]*b[j];
        }
    }
    if(ciclu<=0){
        afis[0]--;
        afis[1]++;
    } else {
        x=(x*x+offsetx)%modx;
        y=(y*y+offsety)%mody;
        afis[1+(m-ver[x][y])/ciclu]--;
        afis[2+(m-ver[x][y])/ciclu]++;
    }
    for(int i=0;i<=m;i++)
        if(afis[i]!=0)
            fout << i << ' ' << afis[i] << '\n';
    return 0;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿
⠀⠀⣶⠀⠀⣀⣤⣶⣤⣉⣿⣿⣤⣀
⠤⣤⣿⣤⣿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣀
⠀⠛⠿⠀⠀⠀⠀⠉⣿⣿⣿⣿⣿⠉⠛⠿⣿⣤
⠀⠀⠀⠀⠀⠀⠀⠀⠿⣿⣿⣿⠛⠀⠀⠀⣶⠿
⠀⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⣿⣤⠀⣿⠿
⠀⠀⠀⠀⠀⠀⠀⣶⣿⣿⣿⣿⣿⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠿⣿⣿⣿⣿⣿⠿⠉⠉
⠀⠀⠀⠀⠀⠀⠀⠉⣿⣿⣿⣿⠿
⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠉
⠀⠀⠀⠀⠀⠀⠀⠀⣛⣿⣭⣶⣀
⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠉⠛⣿
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣉⠀⣶⠿
⠀⠀⠀⠀⠀⠀⠀⠀⣶⣿⠿
⠀⠀⠀⠀⠀⠀⠀⠛⠿⠛
*/