ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire

这题很好啊,好在我没做出来。。。大概分析了一下,题目大概意思就是求

问所有满足1<=i<=n且i与m互素的ai之和

最开始我们队的做法是类似线性筛的方法去筛所有数,把数筛出来后剩下数即可,但是这样的是时间复杂度十分大,我们需要遍历每个质因

的倍数,这样最坏的复杂度是很大的1e8,因为我们需要把i的倍数筛到1e8,这样肯定不行,那么想想其他办法

我们想到了容斥-----(赛后想到的)

我们可以推处一个公式ai=i*i+i;

那么ai的前n项和Tn=n*(n+1)*(2*n+1)/6+n*(n+1)/2;

我们知道了前N项和,再减去和M不互质的数的贡献即可,那么怎么利用上面式子算贡献呢???

根据算数基本定理将m分解,与m不互素的就是至少有其中一个因子,算所有的所以要容斥

对于每个因子积sum,会形成sum,2*sum,3*sum...[n/sum]*sum这些不互素的数,

设k=[n/sum],我们把这些数提出一个sum

那么这些数变成了sum*(1+2+3+....+k)那么在这个sum下,这个贡献T=k*(k+1)*(2*k+1)/6*i*i+k*(k+1)/2*i;

有人回想为什么??需要乘以i*i和i呢??我们可以看一下原来的an=i*i+i;那么前an=(k*i)*(k*i)+k*i=i*i*k*k+k*i;

如果没看懂,可以看看这个

https://blog.csdn.net/lngxling/article/details/82530798

我的代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll inv6=166666668;
ll inv2=500000004;
ll a[10005];
ll sum(ll n,ll i){
   n=n/i;
   ll ans=((n%mod)*(n+1)%mod*(2*n+1)%mod*inv6%mod*i%mod*i%mod+n%mod*(n+1)%mod*inv2%mod*i%mod)%mod;
   return ans;
};
int main(){
   long long n,m;
   int cnt;
   int num[20];
   while(~scanf("%lld%lld",&n,&m)){
      int tmp=m;
      cnt=0;
      while(tmp!=1){
         int flag=0;
         for (int i=2;i<=sqrt(m);i++){
            if (tmp%i==0){
                num[cnt]=i;
                cnt++;
                flag=1;
            }
            while(tmp%i==0){
                tmp/=i;
            }
//cout<<"--"<<endl;
         }
        if(flag==0 && tmp!=1){
            num[cnt]=tmp;
            cnt++;
            break;
        }
      }
      ll ans=sum(n,1);
      ll ans2=0;
      //cout<<"--"<<endl;
      for (int i=1;i<(1<<cnt);i++){
          int flag=0;
          ll temp=1;
          for (int j=0;j<cnt;j++)
            if (i&(1<<j))
          {
                 //   cout<<"--"<<endl;
              flag++;
              temp=temp*num[j]%mod;
          }
         // cout<<"---"<<endl;
          temp=sum(n,temp);
          //cout<<"---"<<endl;
          if (flag%2==1)
          {
              ans2=(ans2%mod+temp%mod)%mod;
          }else {
              ans2=(ans2%mod-temp%mod+mod)%mod;
          }
      }
     printf("%lld\n",(ans%mod-ans2%mod+mod)%mod);
   }
   return 0;
}

原文地址:https://www.cnblogs.com/bluefly-hrbust/p/9610952.html

时间: 2024-11-06 23:09:31

ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire的相关文章

ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph

"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a bipartite graph is a fantastic graph. He has two fantastic numbers, and he wants to let all the degrees to between the two boundaries. You can pick up sev

ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number

A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying two smaller natural numbers. Now lets define a number NN as the supreme number if and only if each number made up of an non-empty subsequence of all

【ACM-ICPC 2018 沈阳赛区网络预赛 I】Lattice&#39;s basics in digital electronics

[链接] 我是链接,点我呀:) [题意] 每个单词的前缀都不同. 不能更明示了... 裸的字典树. 模拟一下.输出一下就ojbk了. [题解] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define all(x) x.begin(),x.end(

ACM-ICPC 2018 沈阳赛区网络预赛

A. Gudako and Ritsuka 留坑 B. Call of Accepted 留坑 C. Convex Hull 留坑 D. Made In Heaven 留坑 E. The cake is a lie 留坑 F. Fantastic Graph 留坑 G. Spare Tire 留坑 H. Hamming Weight 留坑 I. Lattice's basics in digital electronics 留坑 J. Ka Chang 留坑 K. Supreme Number

Made In Heaven 2018 沈阳赛区网络预赛 D题

求第k短路 模板题 套模板即可 #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <queue> using namespace std; const int maxn=1005; const int maxe=100005; struct State{ int f; // f=g+dis dis表示当前点到终点的最短路径,即之前的

【 ACM-ICPC 2018 沈阳赛区网络预赛 D】Made In Heaven

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 点可以重复走的k短路. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define all(x) x.begin(),x.end() #define pb push_bac

ACM-ICPC 2018 沈阳赛区网络预赛 Made In Heaven(K短路)题解

思路:K短路裸题 代码: #include<queue> #include<cstring> #include<set> #include<map> #include<stack> #include<string> #include<cmath> #include<vector> #include<cstdio> #include<iostream> #include<algori

【费马小定理+快速幂取模】ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies

G. Give Candies There are N children in kindergarten. Miss Li bought them N candies. To make the process more interesting, Miss Li comes up with the rule: All the children line up according to their student number (1...N) and each time a child is inv

ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps(模拟+线段树)

https://nanti.jisuanke.com/t/30996 题意 每天增加m个灯泡,n个房间,能一次性换就换,模拟换灯泡过程.询问第几天的状态 分析 离线做,按题意模拟.比赛时线段树写挫了..导致不断超时,我太弱了.每次询问符合要求的最左边的点. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #i