只有千锤百炼,才能成为好钢 2017.8.14 B组

第一题

  1. 选数(number)
    这里写图片描述

Description

Input
这里写图片描述

Output
这里写图片描述

Sample Input

2 2 2 4

Sample Output

3
这里写图片描述

题解:
我们把左右区间分别处理: r = r / k; l = l / k + 1;(不足时加上一)
这样问题就转化为求[l,r]区间内,选n个数其最大公约数为1的方案数
因为r-l<=105 所以这个区间内任意两个不相等的数的最大公约数最大不超过(r - l) <= 105 证明很好证:因为两个数p > q的最大公约数如果为x,那么p / x - q / x >= 1,那么p - q >= x、、、、、、
所以可以暴力所有的最大公约数,设[l,r]中选n个不完全相同的数其最大公约数为i的方案数为dp[i]
那么[l,r]中有多少含i因子的数呢?
显然有t = r / i - l / i个数(l不足时加上一)
那么dp[i] = t的n次方种方案,但是这里面肯定有n个数都相同的方案一共有t个,所以dp[i] = (t的n次方- t) % mod;种方案
但是这个时候是所有n个数有i因子的方案数,而不是gcd=i的方案数,所以dp[i] = dp[i] - dp[j](j <= r - l && j | i)
然后这样dp[1]就是正解了
但是我们注意到,我们的dp[1]是在[l,r]中选n个不完全相同的数其最大公约数为i的方案数,但是实际上我们可以让n个数完全相同(假设为x),但是这样的话n个数的gcd就等于x,所以x必须为k,因为求的是gcd=k的方案数
所以当k∈[l,r]时,dp[1] = dp[1] + 1;

#include<iostream>
#include<cstdio>
#define MOD 1000000007
#define maxn 100000  
using namespace std;
int n,k,l,f[100001],r,falge=0,pd=0,a,b;
long long quick(long long  t,long long n)
{
    long long  ans=1;
    while(n!=0)
    {
        if(n&1)
        {
        ans*=t;
        ans%=MOD;
        }
        t*=t;
        t%=MOD;
        n>>=1;
    }
    return ans;
}
int main()
{
    freopen("number.in","r",stdin);
    //freopen("number.out","w",stdout);
    cin>>n>>k>>a>>b;
    if(k<=r&&k>=l) pd++;
    l=a/k;
    r=b/k;      
    if(a%k) l++;
    for(int i=maxn;i>=1;i--)
    {
        int ll=l/i;
        int rr=r/i;
        if(l%i) ll++;
        int t=rr-ll+1;
        if(l<=r)
        {
            f[i]=quick(rr-ll+1,n);
            f[i]=(f[i]-(rr-ll+1)+MOD)%MOD;
            f[i]%=MOD;
            for(int j=i+i;j<=maxn;j+=i)f[i]=(f[i]-f[j]+MOD)%MOD;
            //f[i]-=f[j]%MOD;
        }
    }
    if(l==1) f[1]++;
    cout<<(f[1]+MOD)%MOD;
    return 0;
}

第二题

  1. H函数 (Standard IO)
    Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
    Goto ProblemSet

Description

  小H是个数学天才,在空闲的时候他喜欢发明各种各样的函数来自娱自乐。再过不久就是小H的同学,小小H的生日了。小H决定将自己刚刚发明的第19911026号函数当作生日礼物送给小小H,并把它命名为H函数。   其中H函数是这样定义的:H[A,B,C,D(x)] = (A * B^x + C) mod D。 在生日party上,小H将自己精心构想的礼物送上。同样精通数学的小小H对H函数自然非常感兴趣,以至于把其他礼物冷落一旁,专心研究H函数。 她想 如果给定一个正整数m,那么可以用F(A, B, C, D) 表示 H[A,B,C,D(x)]在 [1,m]取最小值时的x(x为正整数,且数据保证x值唯一) 善于思考的小小H很快想到一个问题来考考参加party的朋友们。   即给定n, m, {An}, {Bn}, {Cn}, {Dn},求出所有的F(Ai, Bi, Ci, Di)。   追求完美的小小H觉得答案念起来不够好听,为了能达到朗朗上口的效果,她偷偷修改了数据来满足F(Ai, Bi, Ci, Di) ≤ F(Ai+1, Bi+1, Ci+1, Di+1)。

Input

  第1行包含2个正整数n, m。   第2 ~ n + 1行每行包含4个非负整数Ai, Bi, Ci, Di。

Output

  输出文件包含n行,第i + 1行为一个整数,表示F(Ai, Bi, Ci, Di)。   保证F(Ai, Bi, Ci, Di) ≤ F(Ai+1, Bi+1, Ci+1, Di+1)。

Sample Input

3 5 373911025 1525760443 652804587 1767005941 120055457 159868670 59429374 196292251 1200581 955324 141748 2705431

Sample Output

1 2 4

Data Constraint

Hint

温馨提示:在F(Ai+1,Bi+1,Ci+1,Di+1)中,(i+1)为下标 30%的数据满足:1 ≤ n, m ≤ 1000 60%的数据满足:1 ≤ n, m ≤ 10000 100%的数据满足: 1 ≤ n, m ≤ 100000,0

第三题

  1. 奇怪的问题 (Standard IO)
    Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
    Goto ProblemSet

Description

Alice总是会提出很多奇怪的问题,一天他让他的朋友Bob跟他一起研究一个奇怪的问题。问题是:[A,B]中有多少个数满足组成这个数的数字之和为S,另一个问题是[A,B]内满足这一要求最小的数是哪个?
编程帮Bob解决这个问题。

Input

输入包含三个整数A,B和S(1<=A<=B<10^15,1<=S<=135)。

Output

第一行输出一个整数表示满足条件的数的个数;
第二行输出最小的满足条件的数。
输入文件保证至少存在一个数。

Sample Input

输入1:
1 9 5

输入2:
1 100 10

输入3:
11111 99999 24

Sample Output

输出1:
1
5

输出2:
9
19

输出3:
5445
11499

第四题

  1. Alice的游戏 (Standard IO)
    Time Limits: 3000 ms Memory Limits: 65536 KB Detailed Limits
    Goto ProblemSet

Description

  Alice又想到一个游戏:N个数每个数都在0到9之间,可以对每一个数进行加1操作,但这个加1比较特别,0-8加1后会相应变成1-9,但9加1后会变成0,给出N个数,进行M次操作,每次操作都会给出两个整数A和B(1<=A<=B<=N),要求输出第A个数到第B个数的和,然后把A到B之间的每一个数进行一次加1操作。
  你能帮助Alice吗?

Input

  输入文件第一行包含两个整数N和M(1<=N<=250000,1<=M<=100000);
  第二行N个数字,每个数字都在0到9之间,中间没有空格,表示初始值。
  接下来M行,每行包含两个整数A和B(1<=A<=B<=N)

Output

  输出M行,每行表示对应区间的和,注意是先计算后操作。

Sample Input

输入1:
4 3
1234
1 4
1 4
1 4

输入2:
4 4
1234
1 1
1 2
1 3
1 4

输入3:
7 5
9081337
1 3
3 7
1 3
3 7
1 3

Sample Output

输出1:
10
14
18

输出2:
1
4
9
16

输出3:
17
23
1
19
5

Data Constraint

Hint

【数据范围】
  30%的数据N,M<=1000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值