ACM学习历程—HDU5668 Circle(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5668
这题的话,假设每次报x个,那么可以模拟一遍,
假设第i个出局的是a[i],那么从第i-1个出局的人后,重新报数到他假设经过了p个人,
那么自然x = k(n-i)+p(0<= i < n)
即x = p (mod n-i)
然后显然可以得到n个这样的方程,于是就是中国剩余定理了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#define LL long long using namespace std; int n, s[];
bool vis[];
LL rest[], mmod[]; LL gcd(LL a, LL b)
{
LL r;
while (b != )
{
r = b;
b = a%b;
a = r;
}
return a;
} LL lcm(LL a, LL b)
{
return a/gcd(a, b)*b;
} //EXGCD
//求解方程ax+by=d,即ax=d mod(b)
//扩展可求逆元
//O(logn)
void exgcd(LL a, LL b, LL &x, LL &y, LL &d)
{
if (b == )
{
x = ;
y = ;
d = a;
}
else
{
exgcd(b, a%b, y, x, d);
y -= a/b*x;
}
} //中国剩余定理(非互质)
//其中a为除数数组,n为模数数组
LL inv(LL a, LL n)
{
LL x, y, d;
exgcd(a, n, x, y, d);
if (d != )
return -;
return (x%n + n) % n;
} bool Merge(LL a1, LL n1, LL a2, LL n2, LL &aa, LL &nn)
{
LL d = gcd(n1, n2);
LL c = a2 - a1;
if (c % d)
return false;
//(n1/d)*k1 = (c/d)(mod(n2/d))
c /= d;
n1 /= d;
n2 /= d;
//k1 = (c/d)*(n1/d)^(-1)(mod(n2/d))
c *= inv(n1, n2);
c %= n2;//k1
c *= n1 * d;//a = n1*k1+a1
c += a1;
nn = n1*n2*d;
aa = c;
return true;
} LL CRT(int len, LL *a, LL *n)
{
LL a1 = a[], n1 = n[];
LL a2, n2;
for (int i = ; i < len; i++)
{
LL aa, nn;
a2 = a[i], n2 = n[i];
if (!Merge(a1, n1, a2, n2, aa, nn))
return -;
a1 = aa;
n1 = nn;
}
return (a1%n1 + n1) % n1;
} void work()
{
LL ans, tmp = ;
memset(vis, false, sizeof(vis));
int now = , step, t = ;
for (int i = ; i < n; ++i)
{
step = ;
for (int j = t%n; j < n; j = (j+)%n)
{
if (vis[j]) continue;
step++;
if (j == s[now])
{
now++;
vis[j] = true;
rest[i] = step%(n-i);
mmod[i] = n-i;
tmp = lcm(tmp, n-i);
t = j;
break;
}
}
}
ans = CRT(n, rest, mmod);
if (ans == -)
printf("Creation August is a SB!\n");
else
{
ans = (ans%tmp+tmp)%tmp;
if (ans == ) ans = tmp;
cout << ans << endl;
}
} int main()
{
//freopen("test.in", "r", stdin);
int T, u;
scanf("%d", &T);
for (int times = ; times <= T; ++times)
{
scanf("%d", &n);
for (int i = ; i < n; ++i)
{
scanf("%d", &u);
s[u-] = i;
}
work();
}
return ;
}
ACM学习历程—HDU5668 Circle(数论)的更多相关文章
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...
- ACM学习历程—HDU5666 Segment(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5666 这题的关键是q为质数,不妨设线段上点(x0, y0),则x0+y0=q. 那么直线方程则为y = y0/x ...
- ACM学习历程—HDU5585 Numbers(数论 || 大数)(BestCoder Round #64 (div.2) 1001)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5585 题目大意就是求大数是否能被2,3,5整除. 我直接上了Java大数,不过可以对末尾来判断2和5, ...
- ACM学习历程—SNNUOJ 1239 Counting Star Time(树状数组 && 动态规划 && 数论)
http://219.244.176.199/JudgeOnline/problem.php?id=1239 这是这次陕西省赛的G题,题目大意是一个n*n的点阵,点坐标从(1, 1)到(n, n),每 ...
- ACM学习历程—广东工业大学2016校赛决赛-网络赛F 我是好人4(数论)
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=5 这个题目一看就是一道数论题,应该考虑使用容斥原理,这里对lcm进行容斥. ...
- ACM学习历程—HDU5637 Transform(数论 && 最短路)
题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给两种操作,然后给你一个s,一个t,求s至少需要多少次操作到t. 考虑到第一种操作是将 ...
- ACM学习历程—BZOJ2956 模积和(数论)
Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...
- ACM学习历程—SNNUOJ1132 余数之和(数论)
Description F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数.例如F(6) = 6 % 1 + 6 % ...
- ACM学习历程—HDU5478 Can you find it(数论)(2015上海网赛11题)
Problem Description Given a prime number C(1≤C≤2×105), and three integers k1, b1, k2 (1≤k1,k2,b1≤109 ...
随机推荐
- loadrunner脚本篇——Run-time Settings之ContentCheck
运用场景(很少用到): ContentCheck的设置可用来让VuGen检测存在错误的站点页面.如果被测的Web应用没有使用自定义的错误页面,那么这里不用添加规则,因为LR在回放时候,可以默认的捕捉到 ...
- $MySQL常用操作命令备忘
1.登录数据库:mysql -uroot -p12345 (12345为密码)2.创建数据库:create database senguocc; (senguocc为数据库名)3.查看有哪些数据库: ...
- 【leetcode刷题笔记】Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- MySQL索引操作命令详解
创建索引: MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_ ...
- 五、golang实现排序
实现排序: 1.实现一个冒泡排序 2.实现一个选择排序 3.实现一个插入排序 4.实现一个快速排序 冒泡排序 package main import( "fmt" ) func b ...
- WEB开发中常见漏洞
1.sql注入 SQL注入在黑客领域是一种非常常见的攻击手段,大家应该都听说过很多数据泄漏的案例,其中大部分都是采用SQL注入来获取数据的. SQL注入一般是前端向后台提交数据的时候,在数据中加入SQ ...
- list添加map问题
结论: list添加添加的是map的地址 List<Map<String, Object>> list = new ArrayList<>(); Map<St ...
- Ant入门
一.Ant介绍 Ant是Java的生成工具,是Apache的核心项目:直接在apache官网下载即可: Ant类似于Unix中的Make工具,都是用来编译.生成: Ant是跨平台的,而Make不能: ...
- zhly
5. 百叶002 名字2008 1.新浪 阿里矢量图库账号 15031116087 名字2008 2.acdsee 账号 1173209945 同密码一样 3.zhly 我的名字2016 ...
- 自动化收集SQLSERVER诊断信息
自动化收集SQLSERVER诊断信息 相信很多人都遇到过当SQLSERVER出现问题的时候,而你又解决不了需要DBA或者微软售后支持工程师 去帮忙解决问题,那么他们一般需要你收集一些系统信息和SQ ...