【数学】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:\n%d\n",l,j);
68     }
69     return 0;
70 }
71
72 /*
73 //
74
75 //
76 */

时间: 2024-10-29 19:11:31

【数学】XMU 1593 找数字的相关文章

一、数学函数主要用于处理数字,包括整型、浮点数等。

一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 SELECT CEIL(1.5) -- 返回2 FLOOR(x) 返回小于或等于x的最大整数 SELECT FLOOR(1.5) -- 返回1 RAND() 返回0->1的随机数 SELECT RAND() --0.93099315644334 RAND(x) 返回0->1的随机数,x值相同时返

2257: 找数字

2257: 找数字 时间限制: 1 Sec  内存限制: 128 MB提交: 88  解决: 62[提交][状态][讨论版][命题人:zhd] 题目描述 输入两个整数a,b,从n个整数找出能够被a整除,或被b整除,但不能同时被a,b整除数 输入 第1行输入两个整数a,b 第2行输入1个n(0<n<10000) 第3行是n个整数. 输出 输出能够被a整除,或被b整除,但不能同时被a,b整除的数,用空格隔开 样例输入 2 3 3 15 16 24 样例输出 15 16 #include<cs

April Fools Contest 2017 题解&amp;源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间)

A. Numbers Joke time limit per test:2 seconds memory limit per test:64 megabytes input:standard input output:standard output Input The input contains a single integer a (1 ≤ a ≤ 30). Output Output a single integer. Example Input 3 Output 27 题目链接:http

课堂练习之找数字0-N中“1”出现的次数

一.题目与要求 题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12) = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思路 第一种思路: 模10,除10取余,然后寻找规律, 9%10=9.9/10=0: 11%10=1.11/10=1: 15%10=5.15/10=1: ······ 然后写了很多,想到如果模10等于0怎么办

iPad开发--UItextfield中输入类似于数学计算上的数字的方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {            NSCharacterSet*cs;                cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet]

找数字(递归,二分查找)

题目:在一从大到小排序的序列中用递归找一个数在不在这序列,在输出yes,不在输出no 这题用了二分查找的递归实现 思路: 把数组和变量都变成全局变量方便递归函数修改 然后如果不可能就跳出循环 如果可能但现在没找到就缩小范围进入下一个递归过程 如果找到了就输出 代码: #include<bits/stdc++.h> using namespace std; int a[1000]; int n,key; int finder(int l,int r)//左和右 { if(l>r) { co

【刷题】二维数组中找数字

一.描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的排序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.解题思路 关键:从数组的最右上方的数开始判断,根据该数与指定整数的大小进行下一步的比较. 三.代码 根据思路可以得到如下的代码 public class FindInPartiallySortedMatrix { public static void main(String[] args) { int[][] mat

在递增数组中找一个数字

让人瑟瑟发抖的面试题... 来我们看一下题目在一个二维数组中,每一行都按照从左到右递增的顺序操作.每一列都按照从上到下递增的顺序排序.完成代码,输入这样一个二维数组和一个整数,判断数组是否含有该整数 怎么解决勒???分析:如果二维数组是这样,为了解决问题完全可以把数组遍历一遍,但是为了效率,我们需要把时间复杂度降低,为了遍历最少的数字,我们需要把行和列分开.所以,我们会从数组中找一个数字进行判断,然而,随便找一个数字,只会让问题变的跟复杂,比如,找一个10,左边和上边都比10小,而下边和右边都比

【转】String hashCode 方法为什么选择数字31作为乘子

某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途.后来带着疑问和好奇心,到网上去找资料查询一下.在看完资料后,默默的感叹了一句,原来是这样啊.那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜. 2. 选择数字31的原因 在详细说明 String hashC