BZOJ3857: Multiplication table

给了一个K进制的乘法表,给0~K一个映射,给出映射后的乘法表要求复原这个映射

0和1是很容易知道对应哪个的
对于2~K-1(%dalao发现)有一个规律…,即x的那一行/列的乘积,首位数字有x种….
然后就AC了…
小心PE..

code:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;

inline void read(int &x)
{
    char c; while(!((c=getchar())>='0'&&c<='9'));
    x=c-'0';
    while((c=getchar())>='0'&&c<='9') (x*=10)+=c-'0';
}
const int maxn = 510;

int n;
int tx[maxn],ty[maxn],ti;
int sx[maxn],sy[maxn];
bool v[maxn];

int to[maxn],To[maxn];

int main()
{
    int tcase=0;
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i0;
            for(int j=0;jint x,y; read(x),read(y);
                if(tx[x]!=ti) tx[x]=ti,sx[i]++;
                if(ty[y]!=ti) ty[y]=ti,sy[i]++;
            }
            if(sx[i]==1&&sy[i]==1) to[0]=i,v[i]=true;
            else if(sx[i]==1&&sy[i]==n) to[1]=i,v[i]=true;
            else v[i]=false;
        }
        for(int i=0;iif(!v[i]) to[sx[i]]=i;

        printf("Case #%d: %d",++tcase,to[0]);
        for(int i=1;iprintf(" %d",to[i]);
        putchar('\n');
    }

    return 0;
}

你可能感兴趣的:(BZOJ,数学,多校,不知道该分哪的题)