• 【数学】XMU 1593 找数字


    题目链接:

      http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1593

    题目大意

      T组数据,n个数,只有一种出现q次,其余的出现p次。(1<=T<=100,1<=n<=107,1<p,q<200,gcd(p,q)=1)

    题目思路:

      【数学】

      我也不知道这题算不算数学类问题,总之我是不会做的。看了题解还是有些懵逼。

      还是orz一下学长吧

      

        我们想象一个简化版的:有n个数字,其中有1个数会出现1次,其余数都会出现两次,求出现1次的这个数是多少?
        因为x^x=0,所以对所有数取亦或^就行了。
        这题也是同样的思路,我们希望达到这样一种状态:对出现p次的数进行操作后,会抵消为0,所以我们想到了p进制:举个例子p=7,数字11出现了7次,11(十进制)=14(7进制),然后按位分离计算——对所有数转为p进制后,各个位分离计算。
    14(7进制)分离开,得到1和4,于是有4(7进制)*7=40,做无进位加法,就是0。
    所以,一个数转为p进制后,按位分离开,然后做p次无进位加法,就是0。
        上面就是核心思路。至于gcd(p,q)=1方便之后还原出答案。
        其他自己想了。
    学长的题解。

      f[i]表示数字i不进位加了q次完在p进制中为f[i],p和q互质所以f[i]和i一一对应(证明不会。。)
      只需要通过得到的答案中的数倒推回去就可以知道原来的数是几,之后还原回10进制答案

     1 //
     2 //by coolxxx
     3 //
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<string>
     7 #include<iomanip>
     8 #include<memory.h>
     9 #include<time.h>
    10 #include<stdio.h>
    11 #include<stdlib.h>
    12 #include<string.h>
    13 #include<stdbool.h>
    14 #include<math.h>
    15 #define min(a,b) ((a)<(b)?(a):(b))
    16 #define max(a,b) ((a)>(b)?(a):(b))
    17 #define abs(a) ((a)>0?(a):(-(a)))
    18 #define lowbit(a) (a&(-a))
    19 #define sqr(a) ((a)*(a))
    20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
    21 #define eps 1e-8
    22 #define J 10
    23 #define MAX 0x7f7f7f7f
    24 #define PI 3.1415926535897
    25 #define inf 10000000
    26 #define N 104
    27 using namespace std;
    28 int n,m,lll,ans,cas;
    29 int p,q;
    30 int mi[N],a[N],f[N];
    31 void work(int x)
    32 {
    33     int i,j;
    34     for(i=m;i>=0 && x;i--)
    35     {
    36         if(x>=mi[i])
    37         {
    38             a[i]+=x/mi[i];
    39             x%=mi[i];
    40             a[i]%=p;
    41         }
    42     }
    43 }
    44 int main()
    45 {
    46     #ifndef ONLINE_JUDGE
    47 //    freopen("1.txt","r",stdin);
    48 //    freopen("2.txt","w",stdout);
    49     #endif
    50     int i,j,k,l;
    51 //    while(~scanf("%s",s1))
    52 //    while(~scanf("%d",&n))
    53     for(scanf("%d",&cas),l=1;l<=cas;l++)
    54     {
    55         memset(a,0,sizeof(a));
    56         scanf("%d%d%d",&n,&p,&q);
    57         for(i=0;i<p;i++)f[(i*q)%p]=i;
    58         for(i=1,mi[0]=1;mi[i-1]<inf;i++)mi[i]=mi[i-1]*p;
    59         m=i-1;
    60         for(i=1;i<=n;i++)
    61         {
    62             scanf("%d",&k);
    63             work(k);
    64         }
    65         for(j=0,i=0;i<=m;i++)
    66             j+=f[a[i]]*mi[i];
    67         printf("Case %d:
    %d
    ",l,j);
    68     }
    69     return 0;
    70 }
    71 
    72 /*
    73 //
    74 
    75 //
    76 */
    View Code
  • 相关阅读:
    2020系统综合实践 第三次实践作业
    2020系统综合实践 第二次实践作业
    2020系统综合实践 第一次实践作业
    第03组 Beta版本演示
    第03组 Beta冲刺(4/4)
    第03组 Beta冲刺(3/4)
    OO第四次博客作业
    OO第三次博客作业
    OO第二次博客作业
    OO第一次博客作业
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5469384.html
Copyright © 2020-2023  润新知