思路 如果进制为p 那么当x<p时 (p-1)*(p-x)=(p-(x+1)) *p +x 因为x<p 所以没有进位 所以高位上的数字为 p-(x+1)。
根据上面所述。 只要我们能找出 p-1 那么我们根据(p-1)*(p-1)的高位为p-2 就能找出p-2 。找出p-2根据 (p-1)*(p-2)的高位为(p-3) 就能找出p-3.。。。。任务就转化成找出p-1。 我们会发现 从0-(p-2) 都会出现在高位。唯有p-1不会出现。那么就知道要出高位没出现过的数字 就为p-1 那么问题就解决了。由于题目有说读入数据量很大,可以加个读入优化。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include <iostream> using namespace std; int ans[510]; bool bo[510]; int a[510][1020]; inline int ReadInt()//优化接受int数,省时间,具体内容自己看懂,当成模板使用 {char ch = getchar();int data = 0;while (ch < '0' || ch > '9')ch = getchar();do{data = data * 10 + ch - '0';ch = getchar();} while (ch >= '0' && ch <= '9');return data; } int s[505][505]; int main() {int p,ri=0;while(scanf("%d",&p)&&p){for(int i=0;i<p;++i)bo[i]=false;for(int i=0;i<p;++i){for(int j=0;j<2*p;++j){a[i][j]=ReadInt();if(!(j&1)){s[i][j>>1]=a[i][j];bo[a[i][j]]=true;}}}for(int i=0;i<p;++i)if(!bo[i]){ans[p-1]=i;break;}int pre=ans[p-1];for(int i=p-2;i>=0;--i){ans[i]=s[ans[p-1]][pre];pre=ans[i];}printf("Case #%d:",++ri);for(int i=0;i<p;++i)printf(" %d",ans[i]);puts("");}return 0; }