【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] ...
随机推荐
- [转载][来自csdn]RTS和CTS是什么意思?
原文链接: http://blog.csdn.net/zmq5411/article/details/6280332 这篇文章看着挺好,明白易懂,顺手转过来 34RTS和CTS是什么意思? 解释一:R ...
- Bash 基础特性
命令别名 alias 显示当前shell中定义的所有别名 alias 别名='原始命令' unalias 别名 取消定义的别名在命令前加\使用命令本身,而不是别名(或者使用绝对路径执行命令使用命 ...
- Python学习七步走
在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误.在有了初步的怀疑后,你联系运维,查看你的软件日志以了解发生了什么,因为你记得收到 ...
- 【J-meter】正则表达式提取
当获取的值中含有折行,可采用下面的办法解决:
- 从终端运行python程序
终端窗口运行.py程序 首先你要安装python,命令行输入 python 有python提示符 >>> 出现说明安装成功 程序第一行应该是 #! python3 #! python ...
- 紫书 习题 10-4 UVa 1644(素数筛)
素数筛没什么好说的 #include<cstdio> #include<vector> #include<cstring> #define REP(i, a, b) ...
- [洛谷P3121] 审查(黄金) (AC自动机)
题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找 ...
- C#文件拖放至窗口的ListView控件获取文件类型
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Firefox访问https的网站,一直提示不安全
http://mozilla.com.cn/thread-374897-1-1.html 要激活此功能步骤如下: 在地址栏键入"about:config" 点击“我了解此风险” 在 ...
- Python: PS 滤镜--波浪特效
本文用 Python 实现 PS 滤镜的波浪特效,具体效果可以参考之前的博客 http://blog.csdn.net/matrix_space/article/details/42215221 im ...