Submission #485312

# Submission time Handle Problem Language Result Execution time Memory
485312 2021-11-07T05:20:04 Z errorgorn Sažetak (COCI17_sazetak) C++17
160 / 160
5 ms 204 KB
//雪花飄飄北風嘯嘯
//天地一片蒼茫

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << ": " << x << endl

#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define lb lower_bound
#define ub upper_bound

#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()

#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
//change less to less_equal for non distinct pbds, but erase will bug

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

long long inverse(long long a, long long m){
    long long m0 = m;
    long long y = 0, x = 1;

    if (m == 1)
      return 0;

    while (a > 1)
    {
        // q is quotient
        long long q = a / m;
        long long t = m;

        // m is remainder now, process same as
        // Euclid's algo
        m = a % m, a = t;
        t = y;

        // Update y and x
        y = x - q * y;
        x = t;
    }

    // Make x positive
    if (x < 0)
       x += m0;

    return x;
}

int n,m;
ll arr[10];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin.exceptions(ios::badbit | ios::failbit);
	
	cin>>n>>m;
	n--;
	
	rep(x,0,m) cin>>arr[x];
	
	int lim=1;
	rep(x,0,m) lim*=3;
	
	ll ans=0;
	rep(xx,0,lim){
		ll x=xx;
		ll p=1,q=1;
		ll par=1;
		
		rep(y,0,m){
			if (x%3==1) p=p*arr[y]/__gcd(p,arr[y]);
			else if (x%3==2) q=q*arr[y]/__gcd(q,arr[y]);
			
			if (x%3!=0) par*=-1;
			x/=3;
			
			if (p>1e9 || q>1e9) break;
		}
		
		if (p==1 || q==1) continue;
		if (p>1e9 || q>1e9) continue;
		
		
		if (__gcd(p,q)==1){
			ll g=inverse(q,p);
			
			//g*q,(g+p)*q,(g+2p)*q;
			
			//cout<<(n+(p-g)*q)/(p*q)<<endl;
			ans+=par*(n+(p-g)*q)/(p*q);
		}
	}
	
	ll extra=0;
	rep(x,0,m) if (n%arr[x]==0) extra=1;
	cout<<ans+extra<<endl;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Correct 0 ms 204 KB Output is correct
6 Correct 0 ms 204 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 5 ms 204 KB Output is correct
10 Correct 4 ms 204 KB Output is correct