LA 7243 Frogs [容斥定理]

Regionals 2015 :: Asia - Shenyang
#Source
LA 7243
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=692&page=show_problem&problem=5255
#Description
Input N, M
N : 青蛙个数
M : 圈的长度
Input A0, A1, … , AN-1
i青蛙从0开始 每次跳 Ai 格
超过了M. 就mod M
求这些被青蛙所跳过的格子的数之和
#Limits
N < 1e4
M < 1e9
Ai < 1e9
#in.txt

3
2 12
9 10
3 60
22 33 66
9 96
81 40 48 32 64 16 96 42 72

#out.txt

42
1170
1872

#Sample Explanation
N=2 M=12
A0 = 9 A1 = 10

0号青蛙
0 -> 9 -> (9+9) mod 12 = 6 -> (6+9) mod 12 = 3 -> (3+9) mod 12 = 0
经过 0,9,6,3

1号青蛙
10->8->6->4->2->0
总共经过
0 2 3 4 6 8 9 10
S = 42

#Guess
经过的都是gcd(Ai, M)的倍数

#Proof
设经过的点为b
ax = b mod m
ax - b = my
ax - my = b
当且仅当 b = k gcd(a, m)

Bézout’s identity
https://en.wikipedia.org/wiki/Bézout’s_identity

#Algorithm
找到m的所有因子,保存在 factors 数组
对于factors中的每一个元素 x
如果m mod x = 0,则x的所有倍数都需要加到ans里面去
使用function sum来实现
但是会出现重复
对于每个元素
用两个数组记录状态
Used 表明这个元素是否为 gcd(ai, m)
Nums 表明这个元素使用的次数
对于6
Used = true
初始阶段 Nums = 0
执行到元素 2 时,6的倍数被加了1遍 Nums = 1
执行到元素 3 时,6的倍数又被加了1遍 Nums = 2
这样到 6的时候Ans就需要减去一次 6的倍数,同时修改12
对于12
2的时候 Nums++
3的时候 Nums++
到6的时候 Nums- -
所有到12时 Nums == Used 略去了

#Code

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
const ll MAXM = 1e9 + 9;
const ll MAXN = 1e4 + 9;
int a[MAXN];
bool b[MAXM];
int m;
ll sum(ll a0, ll an, ll d) {
  return (a0 + an) * ((an - a0) / d + 1) / 2 - m;
}
void solve() {
  memset(a, 0, sizeof(a));
  int n;
  scanf("%d%d", &n, &m);
  for (ll i = 0; i < n; i++) {
    scanf("%d", &a[i]);
  }
  vector<ll> factors;
  for (ll i = 1; i <= sqrt(m); i++) {
    if (m % i == 0) {
      factors.push_back(i);
      if (i * i != m)
      factors.push_back(m / i);
    }
  }
  sort(factors.begin(), factors.end());
  factors.pop_back();
  ll l = factors.size();
  vector<ll> nums(l, 0);
  vector<bool> used(l, 0);
  for (ll i = 0; i < n; i++) {
    ll it = lower_bound(factors.begin(), factors.end(), __gcd(a[i], m)) - factors.begin();
    for (ll j = it; j < l; j++) {
      if (factors[j] % factors[it] == 0) {
        used[j] = true;
      }
    }
  }
  long long ans = 0;
  for (ll i = 0; i < l; i++) {
    ll t = used[i] - nums[i];
    if (used[i]) {
      ans += t * sum(factors[i], m / factors[i] * factors[i], factors[i]);
      for (ll j = i + 1; j < l; j++) {
        if (factors[j] % factors[i] == 0) {
          nums[j] += t;
        }
      }
    }
  }
  cout << ans << endl;
}
int main() {
 // freopen("in.txt", "r", stdin);
  int t;
  scanf("%d", &t);
  for (int i = 1; i <= t; i++) {
    printf("Case #%d: ", i);
    solve();
  }
}

这个是完整源码 python实现 Flask,Vue 【python毕业设计】基于Python的Flask+Vue物业管理系统 源码+论文+sql脚本 完整版 数据库是mysql 本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值