【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] ...
随机推荐
- 创建vue.js项目
vue init webpack test cd test npm install 或者 cnpm install test npm run dev
- 洛谷3857 [TJOI2008]彩灯
题目描述 已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一个彩灯只有亮与不亮两个状态,所以共有2N个样式.由于技术上的问题,Peter设计的每个开关 ...
- 去除windows编辑文本中的回车符
情景描述: 最近,huskiesir的朋友遇到了一个很奇葩的问题.那就是他在windows上搭建了一个http服务,把A脚本放在了上面并用linux去下载和执行,但是在执行的时候出现了问题,在linu ...
- 快速创建WCF服务和svcutil.exe工具使用
先简单的创建WCF服务: 系统会自动加上IService1接口 和 Service1 实现类 分别在IService1 和Service1 加上2段代码. [ServiceContract] publ ...
- 洛谷—— P1003 铺地毯
https://www.luogu.org/problem/show?pid=1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形 ...
- TRIZ系列-创新原理-7-嵌套原理
原理表述例如以下: 1)把一个物体嵌入另外一个物体.然后将这两个物体再嵌入第三个物体,以此类推. 这个原理又叫俄罗斯娃原理,目的是在不影响原有功能的情况下: A) 在须要时.能够降低系统的体积和便于携 ...
- SQL Source Control
https://documentation.red-gate.com/display/SOC5/SQL+Source+Control+5+documentation Working with migr ...
- Visual Code的调试
Run 'Debug: Download .NET Core Debugger' in the Command Palette or open a .NET project directory to ...
- Linux下清除系统日志方法
摘要:相信大家都是用过Windows的人.对于Windows下饱受诟病的各种垃圾文件都需要自己想办法删除,不然你的系统将会变得越来越大,越来越迟钝!windows怎么清理垃圾相信大家都知道的,那么li ...
- Entity Framework之Model First开发方式
一.Model First开发方式 在项目一开始,就没用数据库时,可以借助EF设计模型,然后根据模型同步完成数据库中表的创建,这就是Model First开发方式.总结一点就是,现有模型再有表. 二. ...