书信(letter)

Description

有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信。 显然, 这样一共有 n!种拿到书信的情况。

现在亮亮规定, 对任意的 1<=x,y<=n, 如果 x 号小朋友拿到 u 号小朋友写的 书信, y 号小朋友拿到 v 号小朋友写的书信, 那么(x+y)号小朋友必须拿到(u+v) 号小朋友写的书信(这里的加法若和超过了 n, 那么就减去 n) 。

小林想知道, 总共有多少种拿到书信的情况呢?

Input

只有一行一个正整数 n。

Output

只有一行一个正整数, 表示符合条件的情况的总数。

这题感觉不太可证明,自己不会

通过枚举全排列打表发现,这题就是一个裸的求\(\phi(n)\)

\(O(\sqrt{n})\)求\(\phi(n)\)的话就不多\(BB\)了 。

这里放一下公式。

\[\phi(x)=x \times \prod_{i=1}^{r} (1-\frac{1}{p_i})
\]

然后直接去求然后输出即可。

代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define int long long
  5. #define R register
  6. using namespace std;
  7. inline void in(R int &x)
  8. {
  9. int f=1;x=0;char s=getchar();
  10. while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
  11. while(isdigit(s)){x=x*10+s-'0';s=getchar();}
  12. x*=f;
  13. }
  14. int n;
  15. inline int phi(int x)
  16. {
  17. int res=x;
  18. for(int i=2;i*i<=x;i++)
  19. {
  20. if(x%i==0)
  21. {
  22. res=res/i*(i-1);
  23. while(x%i==0)x/=i;
  24. }
  25. }
  26. if(x>1)res=res/x*(x-1);
  27. return res;
  28. }
  29. signed main()
  30. {
  31. freopen("letter.in","r",stdin);
  32. freopen("letter.out","w",stdout);
  33. in(n);
  34. printf("%lld\n",phi(n));
  35. fclose(stdin);
  36. fclose(stdout);
  37. return 0;
  38. }

金条(au)

Description

小林在一家商店里购物, 共有 i 件物品, 第 i 件物品的价格为 i。 小林身上带 了许多金条, 每根金条的价值都为整数, 价值为 1~N 的金条数量都足够多。

对于任何一件物品,小林只会用同一价值的若干金条购买它,而且不能找零。 因此, 对于第 i 件物品, 会有 C(i)种购买方法。 小林只会选择这样的一件物品 i 进行购买: C(i) > max{ C(j) }, 1 <= j < i。

请你告诉小林, 他能购买的最贵的物品的价格是多少。

Input

只有一行一个整数 N。

Output

只有一个整数, 表示答案。

通过读题可以发现,我们是求\(1\)到\(n\)之间的约数个数最多的数。

PS:如果两个数的约数个数相同,取较小的一个。

有一个结论:可以求一个数的约数个数。

首先根据唯一分解定理(其中\(p_1\)是素数)

\[x=p_1^{k_1} \times p_2^{k_2} \times p_3^{k_3} \times \dots
\]

那么一个数的约数个数就是这个:

\[d(x)=(k_1+1)\times(k_2+1)\times \dots
\]

\(d(x)\)表示\(x\)的约数个数。

然后通过计算可以知道,在\(2 \times 10^9\)中不同的质数的个数不会超过\(10\)个.

因此我们写出前\(10\)个素数.

然后直接暴力搜索即可。

注意:两个数的约数个数相同的话,取较小的一个。

题目要求严格\(>\)

代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define int long long
  5. #define R register
  6. using namespace std;
  7. inline void in(int &x)
  8. {
  9. int f=1;x=0;char s=getchar();
  10. while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
  11. while(isdigit(s)){x=x*10+s-'0';s=getchar();}
  12. x*=f;
  13. }
  14. int prime[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41};
  15. int ans,mx,n;
  16. void dfs(R int dep,R int now,R int cnt)
  17. {
  18. if(dep>=11)return;
  19. if(cnt>mx)mx=cnt,ans=now;
  20. if(cnt==mx and ans>now)ans=now;
  21. for(R int i=1;i<=32;i++)
  22. {
  23. if(now*prime[dep]>n)break;
  24. dfs(dep+1,now*=prime[dep],cnt*(i+1));
  25. }
  26. }
  27. signed main()
  28. {
  29. freopen("au.in","r",stdin);
  30. freopen("au.out","w",stdout);
  31. in(n);
  32. dfs(1,1,1);
  33. printf("%lld",ans);
  34. fclose(stdin);
  35. fclose(stdout);
  36. return 0;
  37. }

小朋友(friend)

Description

n 个小朋友在一起做游戏, 第 i 个小朋友的快乐值为 Di。 当第 i 个小朋友和 第 j 个小朋友一起玩时, 他们能获得 Di xor Dj 的快乐值。 每一个小朋友 i 都 想知道, 他和谁一起玩能够获得最大的快乐值, 请你帮他们每个人分别求出这个 值。

Input

第一行有一个整数 \(n\)。 第二行三个整数 \(K, B, P\)(\(1≤K≤20\), \(0≤B<2^{16}\), \(0≤P<2^{24}\)) 。 根据 $ D_i = (K \times D_{i-1} + B)%2^{24}$ 和 \(D_1 = P\) 自行计算整个 \(P\) 数组 。

Output

一个整数 \(Ans\),\(Ans=(\sum_{i=1}^{n} 3^{i-1} \times Ans_i)%2^{24}\) 。 其中 \(Ans_i\) 表示对于第 i 个小朋友 我们需要的答案。

表示看到异或,还是取两两异或的最大值,选择树\(01Trie\)。

这个东西网上讲解很多,不多\(BB\).

我们将得到的\(D_i\)插入到\(Trie\)树中。

查询就普通查询(贪心)即可。

时限由于有\(5s\)所以怎么搞都行。

注意不要傻到每次\(ksm\)求\(3^{i-1}\)

可以预处理,可以用一个变量。(这里我用了预处理)

这可以说是一个裸题?

代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define mod 16777216
  5. #define lo long long
  6. #define R register
  7. using namespace std;
  8. const int gz=2e6+5;
  9. inline void in(R lo &x)
  10. {
  11. int f=1;x=0;char s=getchar();
  12. while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
  13. while(isdigit(s)){x=x*10+s-'0';s=getchar();}
  14. x*=f;
  15. }
  16. lo n,K,B,P,ans;
  17. lo a[gz],po[gz]={1};
  18. struct Trie
  19. {
  20. int ch[gz*15][2],idx;
  21. inline void ins(R int x)
  22. {
  23. R int u=0;
  24. for(R int i=25;i>=0;i--)
  25. {
  26. R int bit=(x>>i)&1LL;
  27. if(!ch[u][bit])ch[u][bit]=++idx;
  28. u=ch[u][bit];
  29. }
  30. }
  31. inline int query(R int x)
  32. {
  33. R int u=0,res=0;
  34. for(R int i=25;i>=0;i--)
  35. {
  36. R int bit=(x>>i)&1LL;
  37. if(ch[u][bit^1])
  38. {
  39. res+=(1LL<<i);
  40. u=ch[u][bit^1];
  41. }
  42. else u=ch[u][bit];
  43. }
  44. return res;
  45. }
  46. }woc;
  47. int main()
  48. {
  49. freopen("friend.in","r",stdin);
  50. freopen("friend.out","w",stdout);
  51. in(n);in(K),in(B),in(P);a[1]=P%mod;woc.ins(a[1]);
  52. for(R int i=1;i<=n;i++)po[i]=po[i-1]*3%mod;
  53. for(R int i=2;i<=n;i++)
  54. {
  55. a[i]=((K*a[i-1])%mod+B)%mod;
  56. woc.ins(a[i]%mod);
  57. }
  58. for(R int i=1;i<=n;i++)
  59. (ans+=po[i-1]*woc.query(a[i])%mod)%=mod;
  60. printf("%lld\n",(ans+mod)%mod);
  61. }

11.5NOIP2018提高组模拟题的更多相关文章

  1. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

  2. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  3. 2019.6.21 NOIP2018提高组模拟题(二)

    1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...

  4. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  5. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

  6. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  7. 10.18 NOIP2018提高组模拟题(二)

    大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...

  8. NOIP2018提高组模拟题(二)

    咒语(curse) Description 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路. 正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. 亮亮拿起纸条的一端, ...

  9. XJOI——NOIP2015提高组模拟题19-day1——观光旅行

    http://www.hzxjhs.com:83/contest/493/problem/3 [题目大意] 给定一个有n(n<=500000)个点,m(1<=500000)条边的无向图.给 ...

随机推荐

  1. win8.1 host被删,host无法修改,host无法复制进去解决方案

    1.C:\Windows\System32\drivers\etc\hosts  复制到桌面 2.删除C:\Windows\System32\drivers\etc\hosts 3.右键编辑文本--& ...

  2. [洛谷P4949]最短距离

    题目大意:给一棵基环树,两种操作: $1\;x\;y:$把第$x$条边长度改成$y$ $2\;x\;y:$查询$x$到$y$的最短距离 题解:发现最短距离只有两种可能,第一个是树上的距离,第二种是经过 ...

  3. [Leetcode] n queens ii n皇后问题

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  4. 如何用JavaScript做一个可拖动的div层

    可拖动的层在Web设计中用处很多,比如在某些需要自定义风格布局的应用中,控件就需要拖动操作,下面介绍一个,希望可以满足你的需求,顺便学习一下可拖动的层是如何实现的. 下面是效果演示: 这个DIV可以移 ...

  5. Windows Server 2008 R2 Upgrade Paths

    https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd ...

  6. Nginx support TCP Load balance

    1. Install nginx package 2. edit nginx configuration file [root@ip- nginx]# more nginx.conf user ngi ...

  7. python基础(3)_列表、元组、字典

    一.列表 定义:[ ] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素 特性: > 可存放多个值 > 可修改指定索引位置对应的值,可变 > 按照从左到右的顺序定义列表 ...

  8. SpringMVC异常报406 (Not Acceptable)的解决办法

    使用SpsringMVC,使用restEasy调试,controller请求设置如下: @RequestMapping(value="/list",method=RequestMe ...

  9. 【Foreign】置换 [数论][置换]

    置换 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 4 2 1 4 3 Sample O ...

  10. Linux eject弹出光驱

    Linux eject命令用于退出抽取式设备. 若设备已挂入,则eject会先将该设备卸除再退出. 语法 eject [-dfhnqrstv][-a <开关>][-c <光驱编号&g ...