Atcoder ABC 161 F Division or Substraction 思维+数学

Atcoder ABC 161 F Division or Substraction

题意

给一个正数n(<=1e12)在[2,n] 中取一个k 执行以下步骤:要求n一直大于kif n%k==0:n/=k ,else n-=k问有几个k满足进行这个步骤后剩下的数是1

题解

很套路的题我都不会,我真是太菜了QAQ 1e12 看起来就很根号,根号可以想到质因子或者因子,这题算一下样例就知道和质因子没啥关系所以往因子方面想,一个很简单的思路,我们可以把n拆成(n-1+1)那么只要是n-1的因数,并且不是n的因数,那么就会一直减,直到减完n-1,因为两边同时减一个数模数是不会变得,所以会一直减,直到剩1。n-1的因子算完了,其实n的因子也有可能性,把n唯一分解,假如用n的因数一直除到不能除,也就是没有质因子满足条件,这个时候 剩余值%因子如果等于1。那么n和n-1的因数就算完了,除了这两个数,别的数有没有可能呢,例如n-2的因数非n-1的因数 显然不可能,因为n-2的因数会把n-2给减完 剩余2 ,所以这题就写完了。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define F first
#define S second
#define mkp make_pair
#define pii pair<int,int>
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=2e5+200;

int main(){
	ll n;
	cin>>n;
	vector<ll>a,b;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0){
			a.pb(i);
			if(n/i!=i)a.pb(n/i);
		}
	}
	a.pb(n);
	for(int i=2;i<=sqrt(n-1);i++){
		if((n-1)%i==0){
			b.pb(i);
			if((n-1)/i!=i)b.pb((n-1)/i);
		}
	}
	b.pb(n-1);
	ll cnt=0;
	for(auto p:b){
		if(n%p){
			cnt++;
		}
	}
	for(auto p:a){
		ll tmp=n;
		while(tmp%p==0)tmp/=p;
		if(tmp%p==1)cnt++;
	}
	cout<<cnt<<endl;
}


猜你喜欢

转载自www.cnblogs.com/ttttttttrx/p/12642244.html