1. 程式人生 > >ACM-ICPC 2018 瀋陽賽區網路預賽 G. Spare Tire(容斥)

ACM-ICPC 2018 瀋陽賽區網路預賽 G. Spare Tire(容斥)

樣例輸入 
4 4
樣例輸出 
14

題意:給出a的遞推式,1到n中與m互質的數為i,求a[i]的和

思路:得到a的通項公式為n^2+n,Sn的通項為n*(n+1)*(2n+1)/6+n*(n+1)/2,與m不互質的數,是取m的素因子的乘積,那麼將m分解質因數,通過容斥原理,就可以得到與m不互質的數,總和減去這些數對應的a的和就是答案了。在求這些不互質數對應a的總和的時候,如果一個一個求會超時,需要直接求和。比如存在一個素因子是k,那麼需要求下標為k,2k,3k,4k……的a的和,即求(kn)^2+kn通項的求和,為k^2*n*(n+1)*(2n+1)/6+k*n*(n+1)/2,項數為n/k。

#include<queue>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=100000;
const int mod=1e9+7;
ll mo(ll a,ll pp){
    if(a>=0&&a<pp)return a;
    a%=pp;
    if(a<0)a+=pp;
    return a;
}
ll powmod(ll a,ll b,ll pp){
    ll ans=1;
    for(;b;b>>=1,a=mo(a*a,pp)){
        if(b&1)ans=mo(ans*a,pp);
    }
    return ans;
}

ll inv1(ll b){
	return powmod(b,mod-2,mod);
}
bool check[maxn+7];
int phi[maxn+7];
int prime[maxn+7];
int tot;
void phi_and_prime_table(int N) {
    memset(check,false,sizeof(check));
    phi[1]=1;
    tot=0;
    for(int i=2; i<=N; i++) {
        if(!check[i]) {
            prime[tot++]=i;
            phi[i]=i-1;
        }
        for(int j=0; j<tot; j++) {
            if(i*prime[j]>N)break;
            check[i*prime[j]]=true;
            if(i%prime[j]==0) {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
			else{
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
}
int p[107],dex[107];
int getFactors(ll x) {//分解質因數 
    int fatcnt=0;
    ll tmp=x;
    for(int i=0; prime[i]<=tmp/prime[i]; i++) {
        dex[fatcnt]=0;
        if(tmp%prime[i]==0) {
            p[fatcnt]=prime[i];
            while(tmp%prime[i]==0) {
                dex[fatcnt]++;
                tmp/=prime[i];
            }
            fatcnt++;
        }
    }
    if(tmp!=1) {
        p[fatcnt]=tmp;
        dex[fatcnt++]=1;
    }
    return fatcnt;
}
ll N;
ll S(ll x){
	ll n=N/x;
	ll sum=(n*(n+1)%mod*(2*n+1)%mod)*inv1(6)%mod*x%mod*x%mod+n*(n+1)%mod*inv1(2)%mod*x%mod;
	sum%=mod;
	return sum;
}
int main() {
    phi_and_prime_table(maxn);
	ll m;
    while(~scanf("%lld%lld",&N,&m)){
		int num=getFactors(m);//素因子個數 
		ll sum=S(1);
		ll s=0;
		for(int state=1;state<(1<<num);state++){//遍歷所有狀態 
			int tmp=1;
			int cnt=0;
			for(int i=0;i<num;i++){
				if(state&(1<<i)){
					cnt++;
					tmp*=p[i];
				}
			}
			if(cnt&1){//容斥 
				s=(s+S(tmp))%mod;
			}
			else{
				s=(s-S(tmp)+mod)%mod;
			}
		
		}
		sum=(sum+mod-s)%mod;
		printf("%lld\n",sum);
	}
    return 0;
}

相關推薦

ACM-ICPC 2018 瀋陽賽區網路預賽 G. Spare Tire

樣例輸入 4 4 樣例輸出 14 題意:給出a的遞推式,1到n中與m互質的數為i,求a[i]的和 思路:得到a的通項公式為,Sn的通項為,與m不互質的數,是取m的素因子的乘積,那麼將m分解質因數,通過容斥原理,就可以得到與m不互質的數,總和減去這些數對應的a的

ACM-ICPC 2018 瀋陽賽區網路預賽 G.Spare Tire ()

A sequence of integer{an}{an}can be expressed as: an=⎧⎩⎨⎪⎪⎪⎪023an−1−an−22+n+1n=0n=1n>1an={0n=02n=13an−1−an−22+n+1n>1 Now th

ACM-ICPC 2018 瀋陽賽區網路預賽 J. Ka Chang 分塊+樹狀陣列+dfs序

題意 給你一顆樹,由兩種操作: 1.把這棵樹深度為 D D D的點全部都加上一個值。 2.求以p為根節點的子樹的權值和是多少? 思路 對於樹上的東西,我們可以把他求一下DFS序,之後就可以把樹上的結構變成

ACM-ICPC 2018 瀋陽賽區網路預賽 Made In Heaven第k短路

One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci the father somehow knows it and wants

ACM-ICPC 2018 瀋陽賽區網路預賽 J. Ka Chang 分塊+樹狀陣列+dfs序

題意 給你一顆樹,由兩種操作: 1.把這棵樹深度為DD的點全部都加上一個值。 2.求以p為根節點的子樹的權值和是多少? 思路 對於樹上的東西,我們可以把他求一下DFS序,之後就可以把樹上的結構變成線性的結構,之後就是查詢和修改這兩個東西了。 關於修改

ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies大數冪,尤拉降冪

樣例輸入 1 4 樣例輸出 8 題意:n個小朋友n個糖果,從第一個小朋友開始給糖果,至少給一顆糖果,直到糖果給完,問有幾種分糖果的方法 思路:很容易看出來答案是2^(n-1),問題是n很

ACM-ICPC 2018 南京賽區網路預賽-I:Skrmanacher+Hash

A number is skr, if and only if it’s unchanged after being reversed. For example, “12321”, “11” and “1” are skr numbers, but “123”,

ACM-ICPC 2018 徐州賽區網路預賽 G. Trace (線段樹維護)

題意 你在海灘上有浪花,所有的浪花都是矩形的,當一個浪花來了之後,就會覆蓋他的前一個浪花,問你最後浪花的周長和 思路 我們從後往前來,這樣的話,我們處理的都是會留下來的,怎樣的會留下來呢? 首先我們先看1號點和2號點,由圖我們可以很明顯的看出1號點會被淹沒,而1`和1“他們不會被淹沒

ACM-ICPC 2018 瀋陽賽區網路預賽 J. Ka Chang dfs序+大小分治

Problem J. Ka Chang Input file: standard input Output file: standard output Time limit: 1 seconds Memory limit: 128

【有源匯上下界可行流】ACM-ICPC 2018 瀋陽賽區網路預賽

題意: 給出一張二分圖,初始每個節點的度數都為零。選擇若干條邊,使得每個節點的度數範圍再[L,R]範圍內。每選一條邊,邊上兩端的節點度數+1。 題解: 源點與左邊每個節點連[L,R]的邊。右邊每個節點與匯點連[L,R]的邊。 左右兩邊按照題意連權值為1的邊。

ACM-ICPC 2018 瀋陽賽區網路預賽Dk短路

傳送門 題面: One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci the father somehow knows it

ACM-ICPC 2018 瀋陽賽區網路預賽 K. Supreme Number

題解 題目大意 給你一個n 問你在小於等於n的情況下滿足條件的最大數字是多少 條件是把這個數當作字串 他的所有子段(可以不連續)構成的數字都是質數 暴力打表 打表後發現數字就那麼幾個 接受的時候用字串接受 判斷位數是否大於3(最大滿足條件的數字長度) 大於就轉成int二

ACM-ICPC 2018 瀋陽賽區網路預賽

題意:        給出一張二分圖,初始每個節點的度數都為零。選擇若干條邊,使得每個節點的度數範圍再[L,R]範圍內。每選一條邊,邊上兩端的節點度數+1。 做法:       這道題就是:建一個虛擬源點和一個虛擬匯點,虛擬源點到左邊每個點連一條流量為R-L的邊

ACM-ICPC 2018 瀋陽賽區網路預賽 F題 Fantastic Graph 有源匯的上下界可行流

題意 給你兩個集合X,Y,X集合有N個點,Y集合有M個點,輸入一個上下界down,up,現在有K條邊,輸入K條邊(u,v)。每選擇一條邊(u,v),u和v點的權值就+1,問能否通過選擇一些邊(每條邊只能選一次)使得所有點的權值都在[down,up]之間。 思路 有源匯的

ACM-ICPC 2018 瀋陽賽區網路預賽 J. Ka Chang (分塊+dfs序+樹狀陣列)

題目連結 題意: 給你一顆n個節點的樹,每一個節點的值為0。 q種操作,1.將深度為L的點的權值加x,根節點的深度為0 2.輸出以x為根節點的子樹的權值和 解析: 這道題最後想到了分塊,因為我想到用的一種方法需要用[1e5][1e5]的空間去維護,有空間問題,

ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies

題解 題目大意 按照順序分糖果 每個最少分1個 問有多少種情況 根據題意找到規律 答案為2的n-1次方 使用尤拉降冪和快速冪計算 AC程式碼 #include <stdio.h> #include <bits/stdc++.h>

ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies 打表+指數迴圈節 or尤拉降冪 一題多解

部落格目錄 原題 傳送門  26.61%  1000ms  65536K There are NN children in kindergarten. Miss Li bought them NN candies. To make the process mor

ACM-ICPC 2018 焦作賽區網路預賽 G Give Candies —— 大數

There are NN children in kindergarten. Miss Li bought them NN candies. To make the process more interesting, Miss Li comes up with

ACM-ICPC 2018 焦作賽區網路預賽G

Give Candies  1000ms  65536K There are NN children in kindergarten. Miss Li bought them NN candies. To make the process more interesting

@ACM-ICPC 2018 焦作賽區網路預賽 : G: Give Candies (大數模)

求 %mod ;   劉汝佳紫書上. 程式碼: #include <bits/stdc++.h> using namespace std; typedef unsigned