博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winter is here
阅读量:4114 次
发布时间:2019-05-25

本文共 1137 字,大约阅读时间需要 3 分钟。

  • 题意:给你一串数字,让人找出所有的字串(可不连续),使得该串的gcd()>1,如果该串中有k个数,求出所有满足该条件的字串的k*gcd()的和。
  • 思路:假设某一串的gcd()的长度为n,gcd()为i,则该字串的和为,经过化简可以得到,这个时候会有重复的,我们要减去多加的,这个时候多加的比如这样:2,4 ,8,我们把(4,8)的组合放在gcd()为2的位置了,而实际gcd(4,8)=4,所以我们要减去相同的。
  • #include 
    #include
    #include
    #include
    #include
    using namespace std;const int mod=1000000007;const int maxn=1000000+10;long long dp[maxn];long long a[maxn];int num[1000010];long long b[maxn];int main(){ int n; cin>>n; int maxx=0; dp[0]=1; memset(num,0,sizeof(num)); for(int i=1; i<=n; i++) { int x; cin>>x; maxx=max(maxx,x); dp[i]=(2*dp[i-1])%mod; num[x]++; } long long ans=0; long long sum=0; for(int i=maxx; i>=2; i--) { int temp=0; sum=0; for(int j=i; j<=maxx; j+=i) { temp+=num[j]; } if(temp==0) continue; sum=((long long)temp*dp[temp-1])%mod; for(int j=i*2; j<=maxn; j+=i) { sum=(sum-b[j]+mod)%mod; } b[i]=sum; ans=(ans+((long long)i*sum)%mod)%mod; } cout<
    <
你可能感兴趣的文章
Linux基础系列-可执行程序的产生过程
查看>>
Linux基础系列-Kernel 初始化宏
查看>>
Linux子系统系列-I2C
查看>>
<iOS>关于自定义description的一点用法
查看>>
Unix 命令,常用到的
查看>>
DLL中建立进程共享数据段需要注意的语法问题
查看>>
服务器端技术----Http请求的处理过程
查看>>
如何区分 const char * p, char * const p, const char * * p?
查看>>
C语言-预处理指令2-条件编译
查看>>
C语言-预处理指令3-文件包含
查看>>
C语言-变量类型
查看>>
C语言-static和extern关键字1-对函数的作用
查看>>
C 语言-static和extern关键字2-对变量的作用
查看>>
C# 学习笔记(三) ForEach遍历集合
查看>>
C# 迭代器详解
查看>>
C# 学习笔记(四) 结构体实现接口后是值类型还是引用类型
查看>>
C# 装箱和拆箱
查看>>
C# 学习笔记(五) ++/--运算符重载的意义
查看>>
C# virtual和abstract的区别
查看>>
C++ VS2010中 C++创建DLL图解
查看>>