【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的更多相关文章

  1. 【2017 Multi-University Training Contest - Team 2】Maximum Sequence

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...

  2. 【2017 Multi-University Training Contest - Team 2】 Regular polygon

    [Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...

  3. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

  4. 【2017 Multi-University Training Contest - Team 5】Rikka with Competition

    [Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...

  5. 【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 ...

  6. 【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= ...

  7. 【2017 Multi-University Training Contest - Team 4】Time To Get Up

    [Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...

  8. 【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 ...

  9. 【2017 Multi-University Training Contest - Team 3】RXD and math

    [Link]: [Description] [Solution] 发现1010mod(109+7)=999999937; 猜测答案是nk 写个快速幂; 注意对底数先取模; [NumberOf WA] ...

随机推荐

  1. Python学习笔记(4)--数据结构之元组tuple

    元组(tuple) 定义:tuple和list十分相似,但是tuple是不可变的,即不能修改tuple 初始化:(), ('a', ) , ('a', 'b')   //当只有一个元素时,需加上逗号, ...

  2. ActiveMQ学习总结(8)——消息队列设计精要

    消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一. 当今市面上有很多主流的消息中间件,如老牌的Activ ...

  3. [python]pip坏了怎么办?

    今天,给一位新同事配置pip,用get-pip.py安装之后.出现错误: raise DistributionNotFound(req)  # XXX put more info here pkg_r ...

  4. Cordic 算法入门

    三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)= ...

  5. 智课雅思短语---二、exert positive/ negative effects on…

    智课雅思短语---二.exert positive/ negative effects on… 一.总结 一句话总结:对…产生有利/不利的影响 1.the advantages far outweig ...

  6. Aizu - 2555 Everlasting Zero 模拟

    Aizu - 2555 Everlasting Zero 题意:学习技能,每个技能有不同的要求,问能否学习全部特殊技能 思路:枚举每两个技能,得到他们的先后学习关系,如果两个都不能先学的话就是No了, ...

  7. 线性同余同余方程组解法(excrt)

    [问题描述] 求关于 x 的同余方程组 x%a 1 =b 1  a1=b1 x%a 2 =b 2  a2=b2 x%a 3 =b 3  a3=b3 x%a 4 =b 4  a4=b4 的大于等于 0 ...

  8. 【引用】Android程序实现完全退出

    这是我在网上找到的,方法不错,都能够实现程序的完全退出http://www.jb51.net/article/37992.htm

  9. cf 822B Crossword solving

    B. Crossword solving time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. Juniper Alarms 灯红色报警处理

    1.2.5.1告警查看 root# run show system alarms 2 alarms currently active Alarm time Class Description 2015 ...