poj 1091 跳蚤
来源:互联网 发布:js基本数据类型有几种 编辑:程序博客网 时间:2024/06/11 03:43
题目大意:给你两个数n与m,n代表跳蚤共可以走n+1步,规定最后一步的步长为m,前n步的步长可以为1,2,......,m之中的任意一个。对于每一步步长,跳蚤可以选择向左跳或向右跳相应的长度,如果经过n+1步后,跳蚤能向左移动一步,则称该套步长集符合条件。问总共有多少套符合要求的步长集。
思路:令跳的步长为a[1],a[2],......,a[n+1],将相同长度的步长合并后,问题则转化为对于一组数串b[1],b[2],.. ... ,b[k],是否存在x[1],x[2],... ...,x[k],满足b[1]*x[1]+b[2]*x[2]+... ... +b[k]*x[k]=1,若存在,则步长满足条件。根据扩展欧几里得定理可得,若gcd(b[1],b[2],... ... ,b[k]) = 1,则符合条件。然后按照容斥定理,依次删去不符合条件的步长集,剩下的就是符合条件的。
#include <iostream>#include <cstdio>#include <vector>using namespace std;__int64 n,m,ans,sum;vector<__int64> factor,mul_factor;__int64 int64_pow(__int64 buttom,__int64 index){ __int64 res=1,i; for (i=1;i<=index;i++) res*=buttom; return res;}void mfind(__int64 start_pos,__int64 cnt,__int64 capacity){ __int64 mm=m,i; if (cnt==capacity) { for (i=0;i<capacity;i++) mm/=mul_factor[i]; sum+=int64_pow(mm,n); } else for (i=start_pos;i<factor.size();i++) { mul_factor.push_back(factor[i]); mfind(i+1,cnt+1,capacity); mul_factor.pop_back(); }}int main(){ __int64 i,mm,sign; while (scanf("%I64d%I64d",&n,&m)==2) { ans=int64_pow(m,n); factor.clear(); mm=m; for (i=2;i*i<=mm;i++) if (mm%i==0) { while (mm%i==0) mm/=i; factor.push_back(i); } if (mm!=1) factor.push_back(mm); for (i=1,sign=-1;i<=factor.size();i++) { sum=0; mul_factor.clear(); mfind(0,0,i); ans+=sum*sign; sign*=-1; } printf("%I64d\n",ans); } return 0;}
- POJ 1091 跳蚤
- poj 1091 跳蚤
- POJ 1091 跳蚤
- POJ 1091 跳蚤
- poj 1091 跳蚤
- POJ 1091 跳蚤
- POJ - 1091 跳蚤
- POJ 1091 跳蚤 中文
- poj 1091——跳蚤
- poj 1091 跳蚤(分解质因数+容斥)
- poj 1091 跳蚤 (数论,容斥原理)
- 跳蚤 - POJ 1091 容斥原理
- poj 1091-跳蚤(数论+容斥)
- POJ 1091 跳蚤 容斥原理
- POJ 1091 跳蚤(数论+容斥)
- POJ 1091 跳蚤(容斥原理)
- POJ 1091 跳蚤 【容斥】【质因数分解】
- poj 1091 跳蚤(容斥原理)
- linux内核编译错误记录
- Android开发之多线程处理、Handler详解
- C#原生邮件发送+发送日志记录
- C++指针探讨 (一)
- Windows 7 starting with a temporary profile
- poj 1091 跳蚤
- 链表实现c学生管理系统
- C++指针探讨 (二) 函数指针
- The WiFi Roaming - How WiFi roaming works? - WiFi Roaming
- 数据导入
- CentOS配制FTP服务器,并且能用root权限登录
- Javascript面向对象编程(三):非构造函数的继承
- vs2005(C++)·无法找到“XXX.exe”的调试信息
- WEB应用程序基础