GYM 101102 J.Divisible Numbers(数论+容斥原理)

news/2024/7/7 19:10:32

Description
给出一个长度为n的序列,q次查询,每次查询给出区间[l,r]和一个数s,s的二进制从右往左第i位表示i是否出现,统计[l,r]中有多少数可以被s所表示的这些出现的某一个数整除
Input
第一行一整数T表示用例组数,每组用例首先输入两整数n和q分别表示序列长度和查询数,之后n个数a[i]表示该序列,最后q行每行三个整数l,r,s分别表示查询的区间和1~10这十个数是否出现的二进制表示
(1<=n,q<=1e5,1<=a[i]<=1e9,1<=l<=r<=n,1<=s<=1023)
Output
对于每次查询,输出[l,r]中有多少数被出现的这些数中的某一个整除
Sample Input
1
4 2
2 5 3 8
1 3 2
2 4 355
Sample Output
1
3
Solution
枚举这1023种情况,求出每种情况出现的数字的最小公倍数,去重之后只有47种可能,num[i][j]表示a序列前i个数中有多少数可以被这47个数中的第j个整除,对于每次查询,假设出现的数是b[1]~b[res],如果b序列中某个数可以整除另一个,那么把大的数去掉,因为查询大的数没有意义,例如2 4同时出现,那么被4整除的数字一定被2整除,只需要统计被2整除的数字即可,4可以去掉,去掉这些情况后,用容斥定理计数即可,res最多为5,所以整体时间复杂度是O(47n+31q)
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 100001
int T,n,q,a[666],c[2525],cnt,num[maxn][50],b[11];
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}
void init()
{
    cnt=0;
    for(int k=2;k<1024;k+=2)
    {
        int temp=1;
        for(int i=1;i<10;i++)
            if(k&(1<<i))temp=lcm(temp,i+1);
        a[cnt++]=temp;
    }
    sort(a,a+cnt);
    cnt=unique(a,a+cnt)-a;
    printf("cnt=%d\n",cnt); 
    for(int i=0;i<cnt;i++)c[a[i]]=i;
}
int main()
{
    init();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&q);
        memset(num[0],0,sizeof(num[0]));
        for(int i=1;i<=n;i++)
        {
            int temp;
            scanf("%d",&temp);
            for(int j=0;j<cnt;j++)
            {
                if(temp%a[j]!=0)num[i][j]=num[i-1][j];
                else num[i][j]=num[i-1][j]+1;
            }
        }
        while(q--)
        {
            int l,r,x,res=0;
            scanf("%d%d%d",&l,&r,&x);
            for(int i=0;i<10;i++)
                if(x&(1<<i))b[res++]=i+1;
            if(b[0]==1)printf("%d\n",r-l+1);
            else
            {
                for(int i=0;i<res;i++)
                    for(int j=i+1;j<res;j++)
                        if(b[j]%b[i]==0)
                            swap(b[j],b[res-1]),res--,j--;
                int N=1<<res,ans=0;
                for(int i=1;i<N;i++)
                {
                    int temp=1,count=0;
                    for(int j=0;j<res;j++)
                        if(i&(1<<j))temp=lcm(temp,b[j]),count++;
                    if(count&1)ans+=num[r][c[temp]]-num[l-1][c[temp]];
                    else ans-=num[r][c[temp]]-num[l-1][c[temp]];
                }
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

http://www.niftyadmin.cn/n/3301781.html

相关文章

H5_0018:z-index失效的原因

在做的过程中&#xff0c;发现了一个很简单却又很多人应该碰到的问题&#xff0c;设置Z-INDEX属性无效。 在CSS中&#xff0c;只能通过代码改变层级&#xff0c;这个属性就是z-index&#xff0c; 要让z-index起作用有个小小前提&#xff0c;就是元素的position属性要是relative…

GYM 101102 K.Topological Sort(线段树)

Description 给出一个n个点的图&#xff0c;初始状态i点会向所有编号大于它的点连边&#xff0c;之后删去m条边&#xff0c;求删边之后涂的字典序最小的拓扑序 Input 第一行一整数T表示用例组数&#xff0c;每组用例首先输入两个整数n和m分别表示点数和要删除的边数&#xf…

软件测试和软件调试的区别

最近替客户写论文,整理提纲的时候发现他们把软件的测试和调试的部分分开写,虽然知道两者有区别但是当时根本搞不清楚应该怎么写,网上找了些资料看了以后才有些概念,现在贴出来,以后可那能用的到. 1,软件测试是找出软件已经存在的错误,而调试是定位错误,修改程序以修正错误. 2,…

总结工作中用到的ES6语法,方便工作中查看,也总结一下经验

1.模板字符串&#xff1a; 表现形式&#xff1a;${} 举例子&#xff1a; import axios from axios;let base https://www.baidu.com/home/msg/data/personalcontent; console.log(${base}/login,${base}/login) export const requestLogin params > { return axios.post($…

VS2008安装失败原因总结

今天系统是刚装的&#xff0c;今儿个也不是第一次装系统&#xff0c;也不是第一次装vs2008了&#xff0c;遇上vs2008安装出错倒是头一回。 先装系统&#xff0c;接着装0ffice2007,接着装ms sqlserver 2005,再装adobe cs4 master套装&#xff0c;一路setup&#xff0c;很是顺利&…

GYM 101102 L.Starry Night(贪心+dfs)

Description 给出一棵树&#xff0c;问通过删点最多能够把这棵树变成多少个星星&#xff0c;星星就是一个点周围不小于三条链且不能有分叉 Input 第一行一整数T表示用例组数&#xff0c;每组用例首先输入一整数n表示点数&#xff0c;之后n-1行每行两个整数u和v表示树上一条…

Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析

转载自&#xff1a;http://blog.csdn.net/jqandjq/article/details/5429137 看了这里标题&#xff0c;大家可能以为我会谈TListBox控件&#xff0c;那就错了。我要谈的是Delphi提供给我们的具有列表性质的类&#xff1a;TStringList、TList和TObjectList。TStringList用来存放字…

GYM 101149 A.Balls in Urn(水~)

Description 一次箱子里有n种颜色的球&#xff0c;第i种颜色球有a[i]个&#xff0c;现在可以选出一个球得知其数量&#xff0c;之后会从箱子里一个个把所有球都拿出来要猜其颜色&#xff0c;让最坏情况下猜对的次数最大 Input 第一行一整数n表示球的颜色数量&#xff0c;之后…