Hướng dẫn giải của Tam giác vuông trên vòng tròn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n,i,p,x,d[1000100];
    long long re,a,b,c;
    string s;
    while (1) 
    {
          cin >> s;
          if (s=="[END]") break;
          if (s=="[CASE]")
          {
            cin >> n >> p >> a >> b >> c;
            if (n%2==1)
            {
                cout << 0 << endl;
                continue;
            }
            re=0; 
            for (i=0;i<n;i++) d[i]=0;
            for (i=0;i<p;i++)
            {
                x=(a*i*i+b*i+c)%n;
                d[x]++;                
            } 
            for (i=0;i<n+n;i++)
              if (d[i%n]>1)
              {
                d[(i+1)%n]+=d[i%n]-1;
                d[i%n]=1;
              }
            for (i=0;i+i<n;i++)
              if ((d[i])&&(d[i+n/2]))
                re++;
            cout << re*(p-2) << endl;                            
          }
    }
    return 0;
}

Code mẫu của RR

#include <iostream>
#include <algorithm>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define MAXN 1000111
using namespace std;

char s[20];
int n,p;
long long a,b,c;
int dd[MAXN],next[MAXN];

int get(int u) {
    if (!dd[u]) return u;
    int v=get(next[u]);
    return next[u]=v;
}

int main() {
    cin>>s;
    while (s[1]=='C') {
        scanf("%d %d",&n,&p);
        scanf("%lld %lld %lld",&a,&b,&c);
        if (n==2 || (n&1)==1) {
            printf("0\n");
            cin >>s;
            continue;
        }

        memset(dd,0,sizeof dd);
        FOR(i,0,n-1) next[i]=i+1; next[n-1]=0;
        FOR(i,0,p-1) {
            long long u=(a*(long long)i*i+b*i+c)%n;
            dd[get(u)]=1;
        }

        long long res=0;
        FOR(i,0,n/2-1)
        if (dd[i] && dd[i+(n>>1)])
            res+=p-2;
        printf("%lld\n",res);
        cin>>s;
    }
    return 0;
}

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>

int main()
{
  // freopen("TRICIR.inp","r",stdin);
    long long n,p,a,b,c;
    char s[10];
    while(gets(s)>0)
    {
        if(s[0]!='[')
             continue;
        else if(s[1]=='E')
             break;
        else
        {
            scanf("%lld %lld %lld %lld %lld",&n,&p,&a,&b,&c);
            //if(n==200000) printf("hoanho1\n");
            if(n%2!=0)
                 printf("0\n");
            else
            {
               // if(n==200000) printf("hoanho2\n");
                int next[1000002],kq=0;
                char d[1000002];
                long long KQ;
                for(int i=0;i<n-1;i++)
                {
                     d[i]=0;
                     next[i]=i+1;
                }
                d[n-1]=0; next[n-1]=0;
                 //if(n==200000) printf("hoanho3\n");
                for(int i=0;i<p;i++)
                {
                    long long delta = a*i*i+b*i+c;
                    // if(n==200000) printf("hoanho4\n");
                    long long u = delta%n;
                    //printf("%d\n",i);
                   // if(n==200000) printf("hoanho5\n");
                   int k=0;
                    while(1)
                    {
                      // if(n==4 ) printf("%lld %lld %lld %lld %lld\n",u,delta,a,b,c);
                      /*  if(n==4){
                                 k++;
                                 if(k<=10)
                                    printf("%lld\n",u);
                        //printf("\n %lld \n",u);}
                        }*/
                        if(d[u]==0)
                        {
                       // if(i==130) printf("hoanho6\n");
                             d[u]=1;
                           //  if(n==200000&&i<15)
                             //     printf("%lld\n",u);
                             if(u==0)
                                  next[n-1]=1;
                             else if(u==n-1)
                                   next[n-2]=0;
                             else next[u-1]=u+1;
                             break;
                        }
                      // if(i==130) printf("hoanho7\n");
                        else
                        {
                            //if(i==130) printf("hoanho7\n");
                             long long dm=u;
                             u=next[dm];
                             next[dm]=next[u];

                        }
                    }
                }
                // if(n==200000) printf("hoanho4\n");
                for(int i=0;i<n/2;i++)
                    if(d[i]==1&&d[i+n/2]==1)
                    {
                        kq++;
                       // if(n==200000) printf("%d\n",i);
                    }
                KQ = kq*(p-2);
                printf("%lld\n",KQ,kq);
            }
        }
    }
   //getch();
}

Code mẫu của ll931110

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
typedef long long ll;
using namespace std;

bool red[1000010];
int p[1000010];

int f(int x)
{
    if (x != p[x]) p[x] = f(p[x]);
    return p[x];
};

ll triangleCount(int places,int points,int a,int b,int c)
{
    if (places % 2) return 0;

    for (int i = 0; i < places; i++) p[i] = i;
    memset(red,false,sizeof(red));
    for (int i = 0; i < points; i++)
    {
        int x = (int) (((ll)a * i * i + (ll) b * i + (ll) c) % places);
        int y = f(x);  red[y] = true;
        p[y] = (y + 1) % places;
    };

    int d = 0;
    for (int i = 0; i <= places/2; i++) if (red[i] && red[i + places/2]) d++;
    long long ret = 1LL * d * (points - 2);
    return ret;
};

int main()
{
//    freopen("tri.in","r",stdin);
//    freopen("tri.ou","w",stdout);    
    string s;
    while (1)
    {
          cin >> s;
          if (s == "[END]") break;
          int n,p,a,b,c;
          cin >> n >> p >> a >> b >> c;
          cout << triangleCount(n,p,a,b,c) << endl;
    };
};

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.