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;
}