传送门
D n的奇因子个数的二倍。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=10+7;
typedef pair<int,int> pii;
const double eps=1e-6;
const int inf=0x3f3f3f3f;
#define fi first
#define se second
const int N=200010;
ll n;
void solve(){
scanf("%lld",&n);
int ans=0;
for(int i=1;i<=n/i;++i){
if(n%i) continue;
int j=n/i;
if(i&1) ans+=2;
if((j&1)&&(j!=i)) ans+=2;
}
cout<<ans;
}
int main(){
int _;
// scanf("%d",&_);
_=1;
while(_--){
solve();
}
return 0;
}
E 首先要求这k个数两两之间的最短路,总的点数太多了弗洛伊德不行,k很小,跑k次迪杰斯特拉就好了(bfs会更快),两两之间的最短路有了剩下的就是最短哈密顿路径了,状压dp即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=10+7;
typedef pair<int,int> pii;
const double eps=1e-6;
const int inf=0x3f3f3f3f;
#define fi first
#define se second
const int N=200010;
int n,m,k,c[N];
int h[N],e[N],ne[N],idx;
int d[