【2017 Multi-University Training Contest - Team 2】TrickGCD
【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6053
【Description】
给你一个b数组,让你求一个a数组;
要求,该数组的每一位都小于等于b数组;
且这个b数组的n个数的gcd>=2
【Solution】
设f[i]表示gcd为i的a数组有多少个;
则从gcd大的开始,往gcd小的方向枚举gcd为i;
然后a的每个位置都可以为i的倍数;
则f[i] = a[1]/i * a[2] / i * a[3]/i … a[4]/i;
但是这里可能会重复算了gcd为i的倍数的情况;
则需要减掉f[j],这里j是i的倍数;
但是直接这样做是会超时的;
因为i要枚举n次,那个f[i]算的时候也要枚举n次;
复杂度早就到了N^2了;
ans在计算的时候,需要一些优化;
具体的;
用cnt[i]记录比i小的a数组元素有多少个;
则算出来a[]/i = 1的a[]有多少个,a[]/i = 2的a[]有多少个,a[]/i = 3的a[]有多少个…
a[]/i = 1 的个数 就为 cnt[i+i-1]-cnt[i-1],因为如果a的值在i..i+i-1之间的话,除i的结果都为1;
a[]/i = 2 的计算方法类似..cnt[2*i+i-1]-cnt[2*i-1];
这样,就不用循环n次了;
而只要找i的倍数就好了,依次算出来a[]/i = 1,a[]/i=2…的a[]各有多少个,然后把1^num1,2^num2,3^num3…都乘起来就可以了;
(用个快速幂)
其实关键就是快速幂吧,不然你也没办法快速算x^y,如果不知道快速幂,还是得一个一个乘,那样时间就没变了;
所以可以说这是一道快速幂用来优化的题目?
【NumberOf WA】
2
【Reviw】
一开始想到了这种做法,但没有想到要怎么优化那个n次的循环.
【Code】
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
int T,n,a[N+10],cnt[N+10],f[N+10];
int ksm(int x,int y){
int ans = 1;
while (y){
if (y&1) ans = (ans * x)%MOD;
x = (x*x)%MOD;
y>>=1;
}
return ans;
}
main(){
//freopen("rush.txt","r",stdin);
scanf("%lld",&T);
for (int kk = 1;kk <= T;kk++){
memset(cnt,0,sizeof cnt);
scanf("%lld",&n);
int mi = INF;
for (int i = 1;i <= n;i++){
scanf("%lld",&a[i]);
mi = min(mi,a[i]);
cnt[a[i]]++;
}
for (int i = 1;i <= N;i++)
cnt[i] += cnt[i-1];
for (int i = mi;i >= 2;i--){
f[i] = 0;
if (cnt[i-1] > 0) continue;
int temp = 1;
for (int j = i;j <= N;j+=i){
int num = cnt[min(N,j+i-1)]-cnt[j-1];
int x = j/i;
temp = (temp*ksm(x,num))%MOD;
}
f[i] = temp;
}
int ans = 0;
for (int i = mi;i >= 2;i--){
for (int j = i + i;j <= mi;j+=i)
f[i] = (f[i]-f[j]+MOD)%MOD;
ans = (ans+f[i])%MOD;
}
printf("Case #%lld: %lld\n",kk,ans);
}
return 0;
}
【2017 Multi-University Training Contest - Team 2】TrickGCD的更多相关文章
- 【2017 Multi-University Training Contest - Team 2】Maximum Sequence
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...
- 【2017 Multi-University Training Contest - Team 2】 Regular polygon
[Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...
- 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
[Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Competition
[Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Subset
[Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Graph
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...
- 【2017 Multi-University Training Contest - Team 4】Time To Get Up
[Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...
- 【2017 Multi-University Training Contest - Team 4】Counting Divisors
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6069 [Description] 定义d(i)为数字i的因子个数; 求∑rld(ik) 其中l,r ...
- 【2017 Multi-University Training Contest - Team 3】RXD and math
[Link]: [Description] [Solution] 发现1010mod(109+7)=999999937; 猜测答案是nk 写个快速幂; 注意对底数先取模; [NumberOf WA] ...
随机推荐
- perl JSON模块使用
简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - De ...
- mysql每个表总的索引大小
/* 指定的数据库 每个表的索引 不包含主键索引的大小*/ ,),,),'mb') as index_size from information_schema.tables where TABLE_S ...
- unity C# StackOverflowException
有时候图省事,属性这样写public int pageCount{get{return pageCount;}set{pageCount=value;}}可能会报栈溢出的错误, StackOverfl ...
- 题解 P1198 【[JSOI2008]最大数】
说起来这还是蒟蒻AC的第一道省选线段树呢. 这道题和其他线段树最大的不同就是在于本题数组一直在增大. 寻常的线段树蒟蒻习惯用如下的结构体储存,然而对于此题就不行了: struct node{ int ...
- 题解 P2068 【统计和】
这是一道单点修改,区间查询的线段树. 需要实现的操作有三个:建树,更新与查询. 首先,线段树用结构体维护,如下: struct node { int l, r; int val; } tree[max ...
- ECNUOJ 2147 字符环
字符环 Time Limit:1000MS Memory Limit:65536KBTotal Submit:562 Accepted:146 Description 字符环:就是将给定的一个字符串 ...
- POJ 1887 Testingthe CATCHER (LIS:最长下降子序列)
POJ 1887Testingthe CATCHER (LIS:最长下降子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=200000) ...
- rgba
正反两面展示效果 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...
- Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...
- netflix turbine概述
1.turbine是什么?它的作用是什么? Turbine is a tool for aggregating streams of Server-Sent Event (SSE) JSON data ...