BZOJ1220 HNOI2002 跳蚤


Description

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张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。

Input

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

Output

输出文件有且仅有一行,即可以完成任务的卡片数。1≤M≤10^8,1≤N≤M,且M^N≤10^{16}。(注意:这个数据范围是错的,此题需要高精度。)

Sample Input

2 4

Sample Output

12

HINT

此题需要高精度!


我们考虑有解的情况是什么
就是对于所有的i∈[1,n]的gcd和m互质
直接统计不好搞,就可以用容斥的思想
考虑所有解减去不合法的解
那么如何考虑减去不合法解呢?
考虑容斥一下,累加最大公约数是i的方案数
然后对于i的容斥系数是(−1)^i的质因子数
所以对于每个i的贡献是((m/i)^n*(−1)i的质因子数)
前面一部分的意思是每个位置都可以选择i的倍数的方案数,这也是容斥系数的根源所在
for example:
60=2∗2∗3∗5
一共有2,3,5三个质因子
我们考虑60的贡献
在2,3,5减去了贡献
在2∗3,2∗5,3∗5加上了贡献
所以在60处贡献减去(因为考虑的是减去不合法方案)
然后看10的贡献
在2,5减去了贡献
所以在10加上贡献
就很显然了


 #include<bits/stdc++.h>
using namespace std;
#define N 1010
#define LL long long
#define fu(a,b,c) for(int a=b;a<=c;++a)
#define fd(a,b,c) for(int a=b;a>=c;--a)
const int Base=;
struct Big{
int len,w,t[N];
Big(){len=w=;memset(t,,sizeof(t));}
}ans;
Big change(int a){
Big c;c.len=;
if(a<)c.w=-;
a=abs(a);
while(a)c.t[++c.len]=a%Base,a/=Base;
return c;
}
void print(Big c){
if(c.w==-)printf("-");
printf("%d",c.t[c.len]);
fd(i,c.len-,)printf("%04d",c.t[i]);
printf("\n");
}
bool unsigned_cmp(Big a,Big b){//只比较数字大小
if(a.len>b.len)return ;
if(a.len<b.len)return ;
fd(i,a.len,){
if(a.t[i]>b.t[i])return ;
if(a.t[i]<b.t[i])return ;
}
return ;
}
Big unsigned_add(Big a,Big b){
Big c;c.len=max(a.len,b.len);
fu(i,,c.len)c.t[i]=a.t[i]+b.t[i];
fu(i,,c.len){
if(c.t[i]>Base){
c.t[i]-=Base;
c.t[i+]++;
if(i==c.len)c.len++;
}
}
return c;
}
Big unsigned_sub(Big a,Big b){
Big c;c.len=max(a.len,b.len);
fu(i,,c.len)c.t[i]=a.t[i]-b.t[i];
fu(i,,c.len){
if(c.t[i]<){
c.t[i]+=Base;
c.t[i+]--;
}
}
fd(i,c.len,){
if(!c.t[i])c.len--;
else break;
}
return c;
}
Big add(Big a,Big b){
Big c;
if(unsigned_cmp(b,a))swap(a,b);
if(a.w==&&b.w==)c=unsigned_add(a,b),c.w=;
if(a.w==&&b.w==-)c=unsigned_sub(a,b),c.w=;
if(a.w==-&&b.w==)c=unsigned_sub(a,b),c.w=-;
if(a.w==-&&b.w==-)c=unsigned_add(a,b),c.w=-;
return c;
}
Big sub(Big a,Big b){b.w=-b.w;return add(a,b);}
Big mul(Big a,Big b){
Big c;c.w=a.w*b.w;
c.len=a.len+b.len-;
fu(i,,a.len)
fu(j,,b.len)
c.t[i+j-]+=a.t[i]*b.t[j];
fu(i,,c.len){
if(c.t[i]>Base){
c.t[i+]+=c.t[i]/Base;
c.t[i]%=Base;
if(i==c.len)c.len++;
}
}
return c;
}
Big fast_pow(Big a,int b){
Big ans;ans.t[]=;
if((b&)&&a.w==-)ans.w=-;
while(b){
if(b&)ans=mul(ans,a);
b>>=;
a=mul(a,a);
}
return ans;
}
int n,m;
int p[N],cnt=;
bool check(int vl){
fu(i,,sqrt(vl))
if(vl%i==)return ;
return ;
}
void divide(int num){
fu(i,,num){
if(num%i==&&check(i)){
p[++cnt]=i;
while(num%i==)num/=i;
}
}
}
void dfs(int tmp,LL sum,int typ){
if(tmp>cnt)return;
dfs(tmp+,sum,typ);
sum*=p[tmp];typ*=-;
Big now=change(sum);
now=fast_pow(change(m/sum),n);
now.w=typ;
ans=add(ans,now);
dfs(tmp+,sum,typ);
}
int main(){
scanf("%d%d",&n,&m);
divide(m);
ans=fast_pow(change(m),n);
dfs(,1ll,);
print(ans);
return ;
}

BZOJ1220 HNOI2002 跳蚤 【容斥原理+高精度】*的更多相关文章

  1. luoguP2231 [HNOI2002]跳蚤

    题目链接 bzoj1220: [HNOI2002]跳蚤 题解 根据裴蜀定理,不定方程的解为未知数的gcd,所以选取的n个数的gcd为1 那么n - 1个数保证没有公约数为m的约数,枚举质因数容斥 质因 ...

  2. [BZOJ1220][POJ1091][HNOI2002]跳蚤

    [BZOJ1220][POJ1091][HNOI2002]跳蚤 试题描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长. ...

  3. bzoj千题计划157:bzoj1220:[HNOI2002]跳蚤

    扩展欧几里得:ax+by=gcd(a,b) 一定有解 能跳到左边一格,即ax+by=-1 若a,b的gcd=1,则一定有解 所以问题转化为 求n个不大于m的数,他们与m的gcd=1 的方案数 容斥原理 ...

  4. 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]

    题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...

  5. [HNOI2002]跳蚤

    题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...

  6. [HNOI2002]跳蚤 【容斥】

    题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...

  7. BZOJ 2024: [SHOI2009] 舞会 [容斥原理 高精度]

    题意:和上题基本一样,求至少k对a>b的方案数.不取模!!! 做k+1遍容斥就行了 高精度超强!!!几乎把所有的都用上了 然后,注意有负数,所以容斥的时候正负分别保存然后再一减就行了 这是我省选 ...

  8. P2231 [HNOI2002]跳蚤

    题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...

  9. 【BZOJ 2024】 2024: [SHOI2009] 舞会 (容斥原理+高精度)

    2024: [SHOI2009] 舞会 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 368  Solved: 102 Description OIto ...

随机推荐

  1. javascript 跨域访问

    JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.因为同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象. 下表给出了相对 http://si ...

  2. Java环境搭建指南

    1.1 配置Java环境 1.  下载并安装Jdk1.7或Jdk1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...

  3. Linux内核、 TCP/IP、Socket参数调优

    /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这 ...

  4. awardRotate.js

    (function($) { var supportedCSS,styles=document.getElementsByTagName("head")[0].style,toCh ...

  5. SPA(单页面web应用程序)

    单页web应用(single page web application,SPA),就是只有一张web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的web应用程序. 浏览器一 ...

  6. MySQL索引最左原则

    通过实例理解单列索引.多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: 因为我们不想扫描整表,故考虑用索引. 单列索引: ALTER TABLE people ADD INDEX ...

  7. 关于Spring中applicationContext.xml配置错误“org/springframework/transaction/interceptor/TransactionInterceptor”的问题解决

    问题描述: 在配置spring的applicationContext.xml中的默认事务管理器的时候可能会出现这样的错误: Error occured processing XML 'org/spri ...

  8. 【Python】模块学习之Timer定时任务,递归定时自调获取博客浏览量

    Timer定时任务 下面是Timer函数的官方doc介绍信息 """ Call a function after a specified number of second ...

  9. c中%

    %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适 ...

  10. 在windows操作系统中,查询端口占用和清除端口占用的程序

    一.在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b或用 1.查询端口占用的进程ID 点击"开始"-->"运行&qu ...