[HNOI2002]跳蚤

题目描述

Z城市居住着很多只跳蚤。在Z城市周六生活频道有一个娱乐节目。一只跳蚤将被请上一个高空钢丝的正中央。钢丝很长,可以看作是无限长。节目主持人会给该跳蚤发一张卡片。卡片上写有N+1个自然数。其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字。跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向右跳S个单位长度。而他最终的任务是跳到距离他左边一个单位长度的地方,并捡起位于那里的礼物。

比如当N=2,M=18时,持有卡片(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳10个单位长度,然后再连向左跳3次,每次15个单位长度,最后再向右连跳3次,每次18个单位长度。而持有卡片(12, 15, 18)的跳蚤,则怎么也不可能跳到距他左边一个单位长度的地方。

当确定N和M后,显然一共有MN张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。

输入输出格式

输入格式:

输入文件有且仅有一行,包括用空格分开的两个整数N和M。

输出格式:

输出文件有且仅有一行,即可以完成任务的卡片数。

1≤M≤108,1≤N≤M,且MN≤1016。

输入输出样例

输入样例#1:

2  4

输出样例#1:

12

说明

这12张卡片分别是:

(1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 4, 4), (2, 1, 4), (2, 3, 4),

(3, 1, 4), (3, 2, 4), (3, 3, 4), (3, 4, 4), (4, 1, 4), (4, 3, 4)

题解:

可以说

a1*1+a2*2+a3*3.....+am*m=1有解的方案数

就是GCD(a1,a2,...,am)=1

所以肯定有很多a=0,不为0的最多有n+1个

总方案就是m^n,由容斥原理

先将含有n个1个素数因子的数的方案数减去,再加去n个含有2个素数因子的方案,再减去3个,加上4个的方案。

直到cnt个(素数因子的数量)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 typedef long long lol;
 7 lol n,m,ans;
 8 int cnt,prime[1000001];
 9 lol pow(lol x,lol y)
10 {
11     lol res=1;
12     while (y)
13     {
14         if (y%2==1)
15         res*=x;
16         x*=x;
17         y/=2;
18     }
19     return res;
20 }
21 void dfs(lol goal,lol x,lol c,lol num)
22 {
23
24     if (num>goal)
25     {
26         if (goal%2==1)
27         ans-=pow(m/c,n);
28         else ans+=pow(m/c,n);
29         return;
30
31     }if (x>cnt) return;
32     dfs(goal,x+1,c*prime[x],num+1);
33     dfs(goal,x+1,c,num);
34 }
35 int main()
36 {int i;
37     cin>>n>>m;
38     if (m==0)
39     {
40         cout<<0;
41         return 0;
42     }
43      ans=pow(m,n);
44      lol x=m;
45      for (i=2;i*i<=x;i++)
46      {
47          if (x%i==0)
48          {
49              cnt++;
50              prime[cnt]=i;
51              while (x%i==0) x/=i;
52         }
53      }
54      if (x-1)
55         {
56             cnt++;
57             prime[cnt]=x;
58         }
59      for (i=1;i<=cnt;i++)
60      {
61           dfs(i,1,1,1);
62      }
63     cout<<ans;
64 }
时间: 2024-11-03 01:27:03

[HNOI2002]跳蚤的相关文章

[BZOJ1220][POJ1091][HNOI2002]跳蚤

试题描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字.跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向右跳S个单位长度.而他最终的任务是跳到距离他左边一个单位长度的地方,并捡起位于那里的礼物.比如当N=2,M=18时,持有卡片(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳

bzoj 4310: 跳蚤

Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个,并在选出来的 k 个子串中选择字典序最大的那一个.他称其为"魔力串". 现在他想找一个最优的分法让"魔力串"字典序最小. Input 第一行一个整数 k. 接下来一个长度不超过 105 的字符串 S. Output 输出一行,表示字典序最小的"

BZOJ 1588: [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

小JAVA大世界之程序建模跳蚤实验

package com.chigoe;//房子类class House { private int m;// 保存行数 private int n;// 保存列数 private int[][] a; public House() { // 无参构造方法 m = 10; n = 10; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { a[i][j] = 0; } } public House(int m,int n){//带参

P2234 [HNOI2002]营业额统计 (权值线段树)

P2234 [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 当最小波动值越大

【bzoj4310】跳蚤 后缀数组+二分

题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个,并在选出来的 k 个子串中选择字典序最大的那一个.他称其为“魔力串”. 现在他想找一个最优的分法让“魔力串”字典序最小. 输入 第一行一个整数 k. 接下来一个长度不超过 105 的字符串 S. 输出 输出一行,表示字典序最小的“魔力串”. 样例输入 13 bcbcbacbbbbbabbacbcb

HNOI2002营业额统计(平衡树)

标准的平衡树. 贴个splay吧 var v,l,r,fa:array[0..100000] of longint; root,x,i,n,ans:longint; procedure zig(x:longint); var y,z:longint; begin y:=fa[x];z:=fa[y]; if root=y then root:=x; l[y]:=r[x]; if r[x]<>0 then fa[r[x]]:=y; r[x]:=y; fa[y]:=x; fa[x]:=z; if z

BZOJ 题目1588: [HNOI2002]营业额统计(Splay Tree 求前驱后继)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10828  Solved: 3771 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

luogu P2234 [HNOI2002]营业额统计

二次联通门 : luogu P2234 [HNOI2002]营业额统计 /* luogu P2234 [HNOI2002]营业额统计 splay 每次插入一个数 查询它的前驱与后继 有两点需要注意 1.大部分的数据有误..即输入的数据不够.. 2.判断前驱后继是否存在 3.注意判断该数是否已出现过 */ #include <cstdio> #define Max 50000 #define INF 1e8 namespace Z { inline int min (int a, int b)